类内的Python模拟迭代器函数
我想在我的类内的Python模拟迭代器函数,python,mocking,pytest,patch,Python,Mocking,Pytest,Patch,我想在我的num类中修补\u iter\u 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 d
num
类中修补\u iter\u 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()
但是,,
由于在我的代码中,除了
\uuuu init\uuuu
之外,还有其他重置self.iter=self.iter\u num()
的函数,我不能只设置属性而不修补iter\u num()
函数。在init中,调用self.\u iter\u num()
,并分配返回值
您正在这样做:
mock_iterator.__next__.side_effect = ValueError
但你应该这样做:
mock_iterator.return_value.__next__.side_effect = ValueError
在init中,调用
self.\u iter\u num()
,并分配返回值
您正在这样做:
mock_iterator.__next__.side_effect = ValueError
但你应该这样做:
mock_iterator.return_value.__next__.side_effect = ValueError
@chepner不正确-需要文件名。如果没有它,mock将尝试导入名为
Num
的模块<代码>补丁。对象可能更合适,因为我们直接引用了正在补丁的对象patch.object(Num,“\u iter\u Num”)
@chepner不正确-需要文件名。如果没有它,mock将尝试导入名为Num
的模块<代码>补丁。对象可能更合适,因为我们直接引用了正在补丁的对象patch.object(Num,“\iter\u Num”)
return\u value
对我来说很有意义,但它仍然不起作用。我已经用你的答案编辑了这个问题。@HongruLiu它确实有效,而且。请不要将答案编辑到问题中,这会使答案无效!非常感谢。虽然我不知道为什么本地python3.7-m这个文件.py在我保存更改后不起作用,但它在我的docker中起作用。谢谢..return\u value
对我来说很有意义,但它仍然不起作用。我已经用你的答案编辑了这个问题。@HongruLiu它确实有效,而且。请不要将答案编辑到问题中,这会使答案无效!非常感谢。虽然我不知道为什么本地python3.7-m这个文件.py在我保存更改后不起作用,但它在我的docker中起作用。非常感谢。