![](/img/trans.png)
[英]MagicMock's reset_mock not properly resetting sub-mock's side_effect
[英]Can a mock side_effect iterator be reset after it has been exhausted?
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()
没有解决副作用。
正如 user2357112 评论的那样,重新分配side_effect
将解决您的问题。
>>> from mock import MagicMock
>>>
>>> lst = [1, 2]
>>> mock = MagicMock(side_effect=lst)
>>> mock(), mock()
(1, 2)
>>> mock.side_effect = lst # <-------
>>> mock(), mock()
(1, 2)
请注意,从 Python 3.6 开始,您可以使用以下命令重置模拟side_effect
和return_value
:
mock.reset_mock(return_value=True, side_effect=True)
从文档:
如果您想重置 return_value 或 side_effect,则将相应的参数传递为 True。 子模拟和返回值模拟(如果有)也被重置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.