mock.reset_mock()
不会重置副作用迭代器。 有没有一种方法可以在不再创建模拟的情况下完成这个操作?
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
。 - falsetruside_effect
了吗? - user2357112itertools.xyz
作为side_effect将会非常方便,谢谢。 - wwii