【发布时间】:2014-11-07 16:32:06
【问题描述】:
mock.reset_mock() 不会重置副作用迭代器。有没有办法在不再次创建模拟的情况下做到这一点?
>>> from mock import MagicMock
>>> mock = MagicMock(side_effect = [1,2])
>>> mock(), mock()
(1, 2)
>>> mock()
Traceback (most recent call last):
File "<pyshell#114>", line 1, in <module>
mock()
File "C:\Python27\Lib\site-packages\mock.py", line 955, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "C:\Python27\Lib\site-packages\mock.py", line 1013, in _mock_call
result = next(effect)
StopIteration
>>> mock.reset_mock()
>>> mock()
Traceback (most recent call last):
...
StopIteration
>>> mock = MagicMock(side_effect = [1,2])
>>> mock(), mock()
(1, 2)
>>>
目的是在后续测试中重新使用模拟,但我怀疑它就像生成器一样,不能重新启动。
所以(迟到总比没有好)在被指向正确的方向后,我查看了mock.py,发现side_effect 是一个迭代器对象(一旦用尽就不能重置):
def __set_side_effect(self, value):
value = _try_iter(value)
...
def _try_iter(obj):
...
try:
return iter(obj)
except TypeError:
# XXXX backwards compatibility
# but this will blow up on first call - so maybe we should fail early?
return obj
而def reset_mock() 没有解决副作用。
【问题讨论】:
-
传递无限迭代器怎么样?
mock = MagicMock(side_effect=itertools.cycle([1,2]));您无需拨打reset_mock。 -
@falsetru: 但如果模拟使用不正确,那么下一次调用模拟将给出错误的值。
-
您是否尝试过重新分配
side_effect? -
重新分配迭代器是我一直在寻找的,但我怀疑使用
itertools.xyz来实现副作用会很方便,谢谢。
标签: python unit-testing python-2.7 mocking