我正在使用datashape@datashape.discover.register Python 包并使用装饰器注册一个新类型。我想测试一下,当我调用datashape.discover我正在注册的类型的对象时,它会调用被装饰的函数。我还想用良好的单元测试原则来做到这一点,这意味着实际上不执行被修饰的函数,因为它会产生我不希望在测试中出现的副作用。但是,这是行不通的。
这是一些示例代码来演示该问题:
我的文件.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被调用的任何想法?