如何模拟 __next__ 魔术方法?

问题描述 投票:0回答:1

如何模拟

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__
方法内部。如何让它发挥作用?

python pytest python-unittest python-unittest.mock
1个回答
0
投票

在您的示例中,

__iter__
方法不返回任何内容,因此
__next__
永远不会被调用。

def test_it():
    queue = MagicMock()
    queue.__iter__.return_value = [4, 5, 6]
    consumer = Consumer(queue)
    consumer.consume()
© www.soinside.com 2019 - 2024. All rights reserved.