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
我想修补我的 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