如何模拟
Queue.__next__
魔术方法?下面带有 side_effect
的代码不起作用:
from unittest.mock import MagicMock
class Queue:
def __init__(self):
self.nums = [1, 2, 3]
def __iter__(self):
return self
def __next__(self):
try:
num = self.nums.pop()
except Exception:
raise StopIteration
return num
class Consumer:
def __init__(self, queue):
self._queue = queue
def consume(self):
for msg in self._queue:
raise ValueError(msg)
def test_it():
queue = MagicMock()
queue.__next__.side_effect = [4, 5, 6] # not working
consumer = Consumer(queue)
consumer.consume()
Python 解释器甚至不进入
__next__
方法内部。如何让它发挥作用?
在您的示例中,
__iter__
方法不返回任何内容,因此 __next__
永远不会被调用。
def test_it():
queue = MagicMock()
queue.__iter__.return_value = [4, 5, 6]
consumer = Consumer(queue)
consumer.consume()