实现装饰器将替换一个类与另一个实现

时间:2014-08-26 09:01:21

标签: python python-2.7 decorator

我需要的是这样的东西:

def method():
  my_var = module.Class1()  #actually calling Class1 constructor
  ...

我需要实现一个装饰器,它将使用另一个更改类定义,例如:

@substitute(module.class1 = new_module.class2)
def method():
  my_var = module.Class1()  #actually calling new_module.class2 constructor
  ...

你能不能给我一些提示如何做到这一点。

1 个答案:

答案 0 :(得分:1)

你要做的就是嘲笑。使用mock library执行此操作;该库是Python 3.4的一部分,最多为unittest.mock

使用mock,您可以在仅测试时修补原始函数

try:
    from unittest.mock import patch
except ImportError:
    # Python < 3.4
    from mock import patch

with patch('module.class1') as class1_mock:
    mocked_instance = class1_mock.return_value
    mocked_instance.method_to_be_called.return_value = 'Test return value'

    method()

    mocked_instance.method_to_be_called.assert_called_with('Foo', 'bar')

以上在class1块的持续时间内剔除with,之后撤消补丁。该修补程序将module.class1替换为Mock对象,您也可以访问该class1_mock对象method_to_be_called。上面的示例设置{{1}}以返回绑定的测试返回值,并在测试后验证呼叫签名。