Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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_Unit Testing_Iterator_Mocking - Fatal编程技术网

Python模拟对象迭代器无法多次迭代

Python模拟对象迭代器无法多次迭代,python,unit-testing,iterator,mocking,Python,Unit Testing,Iterator,Mocking,我使用模拟迭代器功能返回单元测试的迭代器。在我正在测试的代码中,我多次循环对象,但它似乎不起作用,只在第一次起作用 self.mock_scene.bpyscene.objects.__iter__ = mock.Mock(return_value=iter([mock_lamp_object, mock_lamp_object])) 我明白了。您只能在模拟迭代器中迭代一次,之后它将耗尽。要解决这个问题,请使用MagicMock及其迭代器,它可以被任意多次使用。您可以使用Mock的side\u

我使用模拟迭代器功能返回单元测试的迭代器。在我正在测试的代码中,我多次循环对象,但它似乎不起作用,只在第一次起作用

self.mock_scene.bpyscene.objects.__iter__ = mock.Mock(return_value=iter([mock_lamp_object, mock_lamp_object]))

我明白了。您只能在模拟迭代器中迭代一次,之后它将耗尽。要解决这个问题,请使用MagicMock及其迭代器,它可以被任意多次使用。

您可以使用Mock的side\u effect参数来替代正在测试的类的u next\uu属性

根据报告:

如果side_effect是一个iterable,那么每个对mock的调用都将返回 iterable中的下一个值

例如:

from unittest.mock import Mock

class Iterable:
    def __iter__(self):
        return self

Iterable.__next__ = Mock(side_effect=[1, 2, 3])

for i in Iterable():
    print(i)
这将产生:

1
2
3

任何符合条件的迭代器在迭代一次后都将耗尽。您需要停止每次重复使用相同的迭代器。