条件模拟:如果条件匹配,则调用原始函数

gue*_*tli 19 python mocking

如何在模拟中有条件地调用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)


Sch*_*eir 6

使用 return_value 或 side_effects返回unittest.mock.DEFAULT将调用原始方法。这应该可以避免一些包装。