Flo*_*ker 5 python python-2.7 python-mock
我正在尝试使用(反向移植)模块将间谍附加到类中的方法mock
。也就是说,我想创建一个模拟,其工作原理与原始方法类似,但提供常用Mock
功能call_count
,例如等。
这是我当前使用的代码:
import mock
class MyClass(object):
def my_method(self, arg):
return arg + 1
def unit_under_test():
inst = MyClass()
return inst.my_method(1)
with mock.patch.object(MyClass, 'my_method', autospec=True,
side_effect=MyClass.my_method) as spy:
result = unit_under_test()
assert result == 2
assert spy.call_count == 1
Run Code Online (Sandbox Code Playgroud)
效果很好。现在我想使用 的自定义子类MagicMock
来代替。文档说这可以通过参数patch
来new_callable
完成。但是,new_callable
和autospec
不能一起使用:
class MyMock(mock.MagicMock):
pass
with mock.patch.object(MyClass, 'my_method', autospec=True,
side_effect=MyClass.my_method,
new_callable=MyMock) as spy:
...
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
File "./mocktest.py", line 19, in <module>
new_callable=MyMock) as spy:
File "/var/foo/venv/local/lib/python2.7/site-packages/mock.py", line 1442, in _patch_object
spec_set, autospec, new_callable, kwargs
File "/var/foo/venv/local/lib/python2.7/site-packages/mock.py", line 1127, in __init__
"Cannot use 'autospec' and 'new_callable' together"
ValueError: Cannot use 'autospec' and 'new_callable' together
Run Code Online (Sandbox Code Playgroud)
问题是省略autospec
也不起作用,因为 thenself
没有传递给原始方法:
with mock.patch.object(MyClass, 'my_method',
side_effect=MyClass.my_method,
new_callable=MyMock) as spy:
...
Run Code Online (Sandbox Code Playgroud)
Traceback (most recent call last):
File "./mocktest.py", line 20, in <module>
result = unit_under_test()
File "./mocktest.py", line 11, in unit_under_test
return inst.my_method(1)
File "/var/foo/venv/local/lib/python2.7/site-packages/mock.py", line 955, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/var/foo/venv/local/lib/python2.7/site-packages/mock.py", line 1018, in _mock_call
ret_val = effect(*args, **kwargs)
TypeError: unbound method my_method() must be called with MyClass instance as first argument (got int instance instead)
Run Code Online (Sandbox Code Playgroud)
请注意,我无法修补my_method
实例,因为我正在测试的MyClass
代码创建了自己的MyClass
实例(如上面的示例代码所示)。
这里的问题是在设置时mock.py
硬编码 MagicMock
为模拟类。autospec
一个简单的解决方法是用MagicMock
你自己的补丁来修补自己:
with mock.patch.object(mock, 'MagicMock', MyMock):
with mock.patch.object(MyClass, 'my_method', autospec=True,
side_effect=MyClass.my_method) as spy:
...
Run Code Online (Sandbox Code Playgroud)
演示: https: //ideone.com/iPMnSc
归档时间: |
|
查看次数: |
548 次 |
最近记录: |