我正在使用datashapePython包并向@datashape.discover.register
装饰器注册一个新类型。我想测试一下,当我对正在注册的类型的对象调用datashape.discover
时,它会调用正在修饰的函数。我还想用良好的单元测试原则来做这件事,这意味着不实际执行被修饰的函数,因为它会产生我不想在测试中看到的副作用。然而,这是行不通的。你知道吗
下面是一些示例代码来演示这个问题:
你知道吗我的文件.py地址:
@datashape.discover.register(SomeType)
def discover_some_type(data)
...some stuff i don't want done in a unit test...
试验_我的文件.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)
问题似乎是我想要mocked的函数在测试主体中被mocked了,但是,在修饰它时(即导入它时)它没有被mocked。discover.register
函数本质上是在内部注册被修饰的函数,以便在用给定类型的参数调用discover()
时查找它。不幸的是,它似乎每次都在内部注册real函数,而不是我想要的补丁版本,因此它总是调用real函数。你知道吗
关于如何修补被修饰的函数并断言在调用datashape.discover
时调用它,有什么想法吗?你知道吗
这里有一个解决方案,我发现它只是一个小黑客:
你知道吗某某类型.py地址:
发现_频道.py地址:
试验_某某类型.py地址:
关键是,在导入具有修饰函数的模块之前,必须修补实际执行的操作,该模块将把修补过的函数注册到datashape。不幸的是,这意味着您不能将修饰函数和执行发现的函数放在同一个模块中(因此在逻辑上应该同时进行的事情现在是分开的)。而且在单元测试中有一个有点黑的import-in-a函数(用来触发
discover.register
)。但至少它是有效的。你知道吗相关问题 更多 >
编程相关推荐