我正在使用datashape Python包,并向@datashape.discover.register
装饰器注册了新类型。我想测试一下,当我调用datashape.discover
正在注册的类型的对象时,它会调用正在装饰的函数。我也想通过良好的单元测试原理来做到这一点,这意味着不实际执行要修饰的功能,因为它会产生我在测试中不需要的副作用。但是,这不起作用。
以下是一些示例代码来演示该问题:
myfile.py:
@datashape.discover.register(SomeType)
def discover_some_type(data)
...some stuff i don't want done in a unit test...
test_myfile.py:
class TestDiscoverSomeType(unittest.TestCase):
@patch('myfile.discover_some_type')
def test_discover_some_type(self, mock_discover_some_type):
file_to_discover = SomeType()
datashape.discover(file_to_discover)
mock_discover_some_type.assert_called_with(file_to_discover)
问题似乎是我要模拟的函数在测试的主体中被模拟,但是在装饰时(即,在导入时)并未被模拟。该discover.register
函数实质上是在内部注册要修饰的函数,以discover()
在使用给定类型的参数调用时对其进行查找。不幸的是,它似乎每次都在内部注册真实函数,而不是我想要的补丁版本,因此它将始终调用真实函数。
关于如何修补要修饰的函数并断言何时datashape.discover
调用它的想法?
这是我发现的一个解决方案,该解决方案只是一个小技巧:
sometype.py:
def discover_some_type(data):
...some stuff i don't want done in a unit test...
Discovery_channel.py:
import sometype
@datashape.discover.register(SomeType)
def discover_some_type(data):
return sometype.discover_some_type(data)
test_sometype.py:
class TestDiscoverSomeType(unittest.TestCase):
@patch('sometype.discover_some_type')
def test_discover_some_type(self, mock_discover_some_type):
import discovery_channel
file_to_discover = SomeType()
datashape.discover(file_to_discover)
mock_discover_some_type.assert_called_with(file_to_discover)
关键在于,在导入具有修饰功能的模块之前,您必须修补将实际执行的操作,然后将修饰后的功能注册到datashape中。不幸的是,这意味着您无法在同一模块中拥有修饰后的功能和进行发现的功能(因此,现在应该逻辑上组合在一起的事物已经分开了)。而且,您在单元测试中具有有点怪异的import-in-a-function的功能(以触发discover.register
)。但是至少它有效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句