首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python的datashape中修补由修饰器注册的方法?

如何在Python的datashape中修补由修饰器注册的方法?
EN

Stack Overflow用户
提问于 2016-05-20 22:25:01
回答 1查看 166关注 0票数 1

我正在使用数据包并向@datashape.discover.register装饰器注册一个新类型。我想测试一下,当我在注册的对象上调用datashape.discover时,它会调用正在修饰的函数。我还想用良好的单元测试原则来实现这一点,这意味着不实际执行正在修饰的函数,因为它会产生我不希望在测试中出现的副作用。然而,这是行不通的。

下面是一些演示问题的示例代码:

myfile.py:

代码语言:javascript
复制
@datashape.discover.register(SomeType)
def discover_some_type(data)
    ...some stuff i don't want done in a unit test...

test_myfile.py:

代码语言:javascript
复制
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时被调用,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-21 00:58:40

这里有一个解决方案,我发现这只是一个小麻烦:

sometype.py:

代码语言:javascript
复制
def discover_some_type(data):
    ...some stuff i don't want done in a unit test...

discovery_channel.py:

代码语言:javascript
复制
import sometype

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

test_sometype.py:

代码语言:javascript
复制
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。不幸的是,这意味着您不能让您的修饰函数和函数在同一个模块中执行发现(因此,逻辑上应该放在一起的东西现在是分开的)。并且您的单元测试中有一个有点麻烦的导入函数(用于触发discover.register)。但至少可以在上工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37356728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档