如何在Python的datashape中修补修饰符注册的方法?

2024-04-26 10:27:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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时调用它,有什么想法吗?你知道吗


Tags: 文件to函数pyregister类型地址def
1条回答
网友
1楼 · 发布于 2024-04-26 10:27:29

这里有一个解决方案,我发现它只是一个小黑客:

你知道吗某某类型.py地址:

def discover_some_type(data):
    ...some stuff i don't want done in a unit test...

发现_频道.py地址:

import sometype

@datashape.discover.register(SomeType)
def discover_some_type(data):
    return sometype.discover_some_type(data)

试验_某某类型.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函数(用来触发discover.register)。但至少它是有效的。你知道吗

相关问题 更多 >