You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Python Mock先返回两次False,后续调用均返回True?

解决Mock对象方法先返回指定值、后续返回固定值的问题

你遇到的StopIteration错误是因为:当给side_effect赋值为可迭代对象时,mock会依次返回该对象中的元素,一旦元素耗尽就会抛出迭代结束的异常;同时,只要设置了side_effect,return_value的配置会被忽略,所以后续调用找不到返回值就触发了报错。

下面提供两种可行的解决方案:

方法一:自定义side_effect函数(灵活控制返回逻辑)

通过一个计数器记录方法的调用次数,根据次数返回对应的值:

def test_moc(self):
    from unittest import mock

    class A:
        def __init__(self):
            self.value = False
        def getValue(self):
            return self.value

    call_count = 0
    def get_value_side_effect():
        nonlocal call_count
        call_count += 1
        return False if call_count <= 2 else True

    # 使用spec参数确保mock符合A类的接口规范
    m = mock.Mock(spec=A)
    m.getValue.side_effect = get_value_side_effect

    self.assertFalse(m.getValue())
    self.assertFalse(m.getValue())
    self.assertTrue(m.getValue())
    self.assertTrue(m.getValue())
    self.assertTrue(m.getValue())

方法二:使用itertools拼接迭代器(简洁实现)

利用itertools.chain和itertools.repeat生成一个永不耗尽的迭代器,先返回两次False,之后无限返回True:

def test_moc(self):
    from unittest import mock
    import itertools

    class A:
        def __init__(self):
            self.value = False
        def getValue(self):
            return self.value

    m = mock.Mock(spec=A)
    # 拼接两个迭代器:先取2个False,之后一直取True
    m.getValue.side_effect = itertools.chain([False, False], itertools.repeat(True))

    self.assertFalse(m.getValue())
    self.assertFalse(m.getValue())
    self.assertTrue(m.getValue())
    self.assertTrue(m.getValue())
    self.assertTrue(m.getValue())

内容的提问来源于stack exchange,提问作者CiaranWelsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:35:31