Python class 中的模拟迭代器函数

Python mock iterator function inside a class

我想修补我的 Num class 中的 _iter_num() 函数,这样它在调用时就会抛出错误。 但是,下面的补丁不起作用。

# this_file.py
from unittest.mock import patch, MagicMock
import pytest

class Num:
    def __init__(self):
        self.iter = self._iter_num()

    def _iter_num(self):
        yield 1

    def get_next(self):
        return next(self.iter)

@patch("this_file.Num._iter_num") # this_file is the filename.
def test_mock(mock_iterator):
    mock_iterator.__next__.side_effect = ValueError
    it = Num()
    # it.iter = MagicMock()
    # it.iter.__next__.side_effect = ValueError

    with pytest.raises(ValueError):
        it.get_next()
# Failed: DID NOT RAISE <class 'ValueError'>

当我直接将 self.iter 设置为 MagicMock 时,它起作用了

# it.iter = MagicMock()
# it.iter.__next__.side_effect = ValueError

但是, 因为除了 __init__ 之外,我的代码中还有其他函数重置 self.iter = self.iter_num(),我不能只设置属性而不修补 iter_num() 函数。

在init中,self._iter_num()调用并赋值返回值。

您正在这样做:

mock_iterator.__next__.side_effect = ValueError

但是你应该这样做:

mock_iterator.return_value.__next__.side_effect = ValueError