我有一个模块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嘲笑添加了。关于如何做到这一点的任何想法?
答案 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对象中,但我认为这可以回答你的问题。