Python 模拟 return 初始预定义值后的默认值 returned
Python mock return default value after initial predefined values returned
我正在模拟一个消息队列,我希望它在每次调用时 return 2 条消息然后 return None (模拟消息队列是现在是空的)。但是,在第三次消息调用之后,我从模拟框架中收到一条错误消息,指出没有 "next" 值。
这是一个例子:
from mock import MagicMock
mock_message_queue = MagicMock(name='message_queue')
expected_messages = ['message 1', 'message 2', None]
mock_message_queue.fetch.side_effect = expected_messages
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
输出:
mock_message_queue.fetch() = message 1
mock_message_queue.fetch() = message 2
mock_message_queue.fetch() = None
Traceback (most recent call last):
File "/home/wsi/.PyCharm2017.1/config/scratches/mock_message_bus.py", line 10, in <module>
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
File "/usr/local/lib/python3.5/dist-packages/mock/mock.py", line 1062, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/mock/mock.py", line 1121, in _mock_call
result = next(effect)
StopIteration
Process finished with exit code 1
所以基本上我希望它总是 return None 在它 returns 'message 2' 之后。有人知道怎么做吗?
问题是您需要值列表的最后一个元素无限重复。您可以为此使用 itertools.repeat
,并使用 itertools.chain
将其加入实际值列表。
expected_messages = itertools.chain(['message 1', 'message 2'], itertools.repeat(None))
我正在模拟一个消息队列,我希望它在每次调用时 return 2 条消息然后 return None (模拟消息队列是现在是空的)。但是,在第三次消息调用之后,我从模拟框架中收到一条错误消息,指出没有 "next" 值。
这是一个例子:
from mock import MagicMock
mock_message_queue = MagicMock(name='message_queue')
expected_messages = ['message 1', 'message 2', None]
mock_message_queue.fetch.side_effect = expected_messages
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
输出:
mock_message_queue.fetch() = message 1
mock_message_queue.fetch() = message 2
mock_message_queue.fetch() = None
Traceback (most recent call last):
File "/home/wsi/.PyCharm2017.1/config/scratches/mock_message_bus.py", line 10, in <module>
print('mock_message_queue.fetch() = {}'.format(mock_message_queue.fetch()))
File "/usr/local/lib/python3.5/dist-packages/mock/mock.py", line 1062, in __call__
return _mock_self._mock_call(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/mock/mock.py", line 1121, in _mock_call
result = next(effect)
StopIteration
Process finished with exit code 1
所以基本上我希望它总是 return None 在它 returns 'message 2' 之后。有人知道怎么做吗?
问题是您需要值列表的最后一个元素无限重复。您可以为此使用 itertools.repeat
,并使用 itertools.chain
将其加入实际值列表。
expected_messages = itertools.chain(['message 1', 'message 2'], itertools.repeat(None))