Python模拟 - return_value - 获得“真实”的返回值

时间:2017-03-02 11:50:10

标签: python pytest python-mock

当使用patch.object来模拟方法时,有没有办法指定对于某些参数值,该方法将运行,因为它根本没有被模拟,并将返回“真正的”return_value,以及其他参数值来设置特定的return_value?

感谢。

1 个答案:

答案 0 :(得分:0)

这是一个解决方案(从我使用过的地方进行了修改),效果相当不错。它涉及将补丁的side_effect设置为函数。

import os.path
from unittest import mock

def different_return_values(dct):
     def f(*args):
         return dct[args]
     return f

with mock.patch.object(
    os.path,
    'exists',
    side_effect=different_return_values({
        # The "generic" version above makes the arguments in order
        # the keys to this map, you could write a specialized version
        # which has a single argument or *whatever* key combination you
        # like
        ('myfile',): True,
        ('wat',): 'not a real return value but hey, monkeypatch!',
        ('otherfile',): False,
    }),
):
    print(os.path.exists('myfile'))
    print(os.path.exists('wat'))
    print(os.path.exists('otherfile'))

OUTPUT = """\
True
not a real return value but hey, monkeypatch!
False
"""

这里的内容是,您可以提供正在修补的功能的更智能实现side_effecthttps://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.side_effect