可以在模拟用尽的side_effect迭代器用尽之后将其重置吗? [英] Can a mock side_effect iterator be reset after it has been exhausted?

查看:92
本文介绍了可以在模拟用尽的side_effect迭代器用尽之后将其重置吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

mock.reset_mock()不会重置副作用迭代器.有没有一种方法可以避免再次创建模拟?

mock.reset_mock() will not reset a side effect iterator. Is there a way to do this without creating the mock again?

>>> 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)
>>> 

目的是在后续测试中重用该模拟,但我怀疑它不能像生成器一样重新启动.

The intent is to re-use the mock in subsequent tests but I suspect that, like a generator, it cannot be restarted.

因此(朝着正确的方向(迟到总比没有好)),我朝着mock.py方向看去,发现side_effect是一个迭代器对象(一旦用完就无法 reset ):

So (better late than never) after being pointed in the right direction I looked in mock.py and found that side_effect is an iterator object (which cannot be reset once exhausted):

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将解决您的问题.

As user2357112 commented, reassigning side_effect will solve you problem.

>>> from mock import MagicMock
>>>
>>> lst = [1, 2]
>>> mock = MagicMock(side_effect=lst)
>>> mock(), mock()
(1, 2)
>>> mock.side_effect = lst  # <-------
>>> mock(), mock()
(1, 2)

这篇关于可以在模拟用尽的side_effect迭代器用尽之后将其重置吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆