如何在模拟中有条件地调用orignal方法?
在这个例子中,我只想伪造一个返回值if bar=='x'.否则我想调用原始方法.
def mocked_some_method(bar):
if bar=='x':
return 'fake'
return some_how_call_original_method(bar)
with mock.patch('mylib.foo.some_method', mocked_some_method):
do_some_stuff()
Run Code Online (Sandbox Code Playgroud)
我知道这有点奇怪.如果我想mylib.foo.some_method在侧面假装do_some_stuff()它应该是无条件的.some_method应该嘲笑所有(不是一些)呼叫.
在我的情况下,它是一个集成测试,而不是mylib.foo.some_method一个小的单元测试,并且是一种经常被使用的调度程序.在一个案例中,我需要伪造结果.
Mic*_*ico 21
如果你只需要替换行为而不需要关心mock的调用assert函数,你可以使用new参数; 否则你可以使用side_effect那个可以调用.
我猜这some_method是一个对象方法(而不是a staticmethod)所以你需要一个引用它的对象来调用它.你的包装器应该声明对象和你的补丁用作第一个参数,autospec=True以便为side_effectcase 使用正确的签名.
最后的技巧是保存原始方法引用并使用它来进行调用.
orig = mylib.foo.some_method
def mocked_some_method(self, bar):
if bar=='x':
return 'fake'
return orig(self, bar)
#Just replace:
with mock.patch('mylib.foo.some_method', new=mocked_some_method):
do_some_stuff()
#Replace by mock
with mock.patch('mylib.foo.some_method', side_effect=mocked_some_method, autospec=True) as mock_some_method:
do_some_stuff()
assert mock_some_method.called
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8502 次 |
| 最近记录: |