Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类内的Python模拟迭代器函数_Python_Mocking_Pytest_Patch - Fatal编程技术网

类内的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中起作用。非常感谢。