【问题标题】:Python Mock Object Iterator Not Able To Iterate Multiple TimesPython Mock 对象迭代器无法迭代多次
【发布时间】:2020-01-03 04:58:49
【问题描述】:

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

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

【问题讨论】:

    标签: python unit-testing iterator mocking


    【解决方案1】:

    您可以使用Mockside_effect 参数来替代您正在测试的类的__next__ 属性。

    根据documentation

    如果side_effect 是可迭代的,则每次调用模拟都将返回 可迭代的下一个值。

    例子:

    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
    

    【讨论】:

      【解决方案2】:

      想通了。您只能通过模拟迭代器迭代一次,之后它就会被耗尽。要解决这个问题,请使用 MagicMock 及其迭代器,您可以随意使用它。

      【讨论】:

      • 任何符合条件的迭代器在你迭代一次后都会被耗尽。您需要停止每次重复使用相同的迭代器。
      • @Vayelin 你能否提供一个关于如何模拟迭代器进行多次迭代的工作示例?这就是你的问题所要求的对吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2013-02-26
      • 2016-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多