我需要的是这样的东西:
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
...
你能不能给我一些提示如何做到这一点。
答案 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}}以返回绑定的测试返回值,并在测试后验证呼叫签名。