在Python中使用某个参数模拟一个函数

时间:2016-08-06 01:25:09

标签: python mocking

我有一个模块a.py:

def add(x, y):
    return x + y

def do_math(x):

    sum1 = add(x, 1)
    sum2 = add(x, 2)
    sum3 = add(x, 3)

    return sum1 + sum2 + sum3

在测试中运行do_math函数会导致以下结果:

print a.do_math(1)
9

我想在y为2时模拟add函数。但是,以下结果是无限循环:

def mock_add(*args, **kwargs):
    x = args[0]
    y = args[1]
    if y == 2:
        return 4
    else:
        a.add(x, y)

with patch('a.add', side_effect=mock_add):
    a.do_math(1)

以下是我的错误消息的一部分:

  File "E:\somepath\mock-1.3.0\mock\mock.py", line 1062, in __call__
    return _mock_self._mock_call(*args, **kwargs)
  File "E:\somepath\mock-1.3.0\mock\mock.py", line 1067, in _mock_call
    self.called = True
RuntimeError: maximum recursion depth exceeded while calling a Python object

我应该知道的更好。我已经用mock_add嘲笑添加了。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

为什么不在通话前保存功能?

from mock.mock import patch
import a

original = a.add
def mock_add(*args, **kwargs):
    x = args[0]
    y = args[1]
    if y == 2:
        return 4
    else:
        return original(x, y)

with patch('a.add', side_effect=mock_add):
    a.do_math(1)

如果你想保持面向对象的性质,你可以将所有这些存储在MagicMock对象中,但我认为这可以回答你的问题。