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

丹·科茨(Dan Coates)

我正在使用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调用它的想法

丹·科茨(Dan Coates)

这是我发现的一个解决方案,该解决方案只是一个小技巧:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在装饰器中注册其装饰的所有功能?

来自分类Dev

ServiceStack使用RouteAttribute在AppHost VS装饰器中注册路由

来自分类Dev

WinRT Caliburn Micro SimpleContainer:在容器中注册装饰器

来自分类Dev

如何在简单注入器中注册实例集合

来自分类Dev

在Python库中注册Robot Framework侦听器

来自分类Dev

如何注册手动创建的装饰器实例

来自分类Dev

如何为CQRS的通用对象注册autofac装饰器

来自分类Dev

在Python中注册信号处理程序的正确方法是什么?

来自分类Dev

如何用装饰器类装饰实例方法?

来自分类Dev

使用装饰器时如何在VueJS中使用Data对象?“预期由类方法'数据'使用的'this'。”

来自分类Dev

如何为Autofac中的开放式通用注册注册开放式通用装饰器?

来自分类Dev

如何为Autofac中的开放式通用注册注册开放式通用装饰器?

来自分类Dev

Python中的部分方法继承/装饰器

来自分类Dev

python装饰器和静态方法

来自分类Dev

Python - 内置类方法的装饰器?

来自分类Dev

如何理解python装饰器参数传递

来自分类Dev

Python“多层装饰器”-这是如何工作的?

来自分类Dev

如何使用带参数的python装饰器?

来自分类Dev

用python装饰装饰器

来自分类Dev

如何在Grails中注册自定义json解串器/解析器?

来自分类Dev

使用装饰器修补模块中的所有功能

来自分类Dev

使用装饰器修补模块中的所有功能

来自分类Dev

在Autofac中注册的组件实例是否与在控制器中注入的Global.asax方法中的InstancePerLifetimeScope相同?

来自分类Dev

在Autofac中注册的组件实例是否与在控制器中注入的Global.asax方法中的InstancePerLifetimeScope相同?

来自分类Dev

如何修补由导入的类导入的函数?

来自分类Dev

在编译器中注册分配

来自分类Dev

Android:在库中注册接收器

来自分类Dev

在隔离捆绑中注册Symfony水化器

来自分类Dev

在 jOOQ 中注册全局转换器

Related 相关文章

  1. 1

    如何在装饰器中注册其装饰的所有功能?

  2. 2

    ServiceStack使用RouteAttribute在AppHost VS装饰器中注册路由

  3. 3

    WinRT Caliburn Micro SimpleContainer:在容器中注册装饰器

  4. 4

    如何在简单注入器中注册实例集合

  5. 5

    在Python库中注册Robot Framework侦听器

  6. 6

    如何注册手动创建的装饰器实例

  7. 7

    如何为CQRS的通用对象注册autofac装饰器

  8. 8

    在Python中注册信号处理程序的正确方法是什么?

  9. 9

    如何用装饰器类装饰实例方法?

  10. 10

    使用装饰器时如何在VueJS中使用Data对象?“预期由类方法'数据'使用的'this'。”

  11. 11

    如何为Autofac中的开放式通用注册注册开放式通用装饰器?

  12. 12

    如何为Autofac中的开放式通用注册注册开放式通用装饰器?

  13. 13

    Python中的部分方法继承/装饰器

  14. 14

    python装饰器和静态方法

  15. 15

    Python - 内置类方法的装饰器?

  16. 16

    如何理解python装饰器参数传递

  17. 17

    Python“多层装饰器”-这是如何工作的?

  18. 18

    如何使用带参数的python装饰器?

  19. 19

    用python装饰装饰器

  20. 20

    如何在Grails中注册自定义json解串器/解析器?

  21. 21

    使用装饰器修补模块中的所有功能

  22. 22

    使用装饰器修补模块中的所有功能

  23. 23

    在Autofac中注册的组件实例是否与在控制器中注入的Global.asax方法中的InstancePerLifetimeScope相同?

  24. 24

    在Autofac中注册的组件实例是否与在控制器中注入的Global.asax方法中的InstancePerLifetimeScope相同?

  25. 25

    如何修补由导入的类导入的函数?

  26. 26

    在编译器中注册分配

  27. 27

    Android:在库中注册接收器

  28. 28

    在隔离捆绑中注册Symfony水化器

  29. 29

    在 jOOQ 中注册全局转换器

热门标签

归档