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

Pytest使用PropertyMock模拟属性返回不同值时触发可迭代错误

解决Pytest中PropertyMock模拟实例属性报错的问题

问题分析

你直接将PropertyMock对象赋值给实例的普通属性a2,导致遍历self.a2时,程序把PropertyMock本身当成迭代对象,从而抛出TypeError: 'PropertyMock' object is not iterable错误。

PropertyMock的设计用途是模拟类中被@property装饰的属性,而非直接赋值给实例的普通属性。要让普通实例属性每次访问返回不同值,得通过mocker.patch.object来替换属性的访问逻辑。

修复后的代码

class A:
    def __init__(self):
        self.a1 = [1, 1]
        self.a2 = [2, 2]
        self.a3 = [3, 3]
    def run(self):
        for i in self.a2:
            print(f"val in a2: {i}")

def test_A(mocker):
    myObj = A()
    # 使用patch.object替换实例a2属性的访问行为
    mocker.patch.object(myObj, 'a2', new_callable=mocker.PropertyMock, side_effect=[[2, 3], [3,4], [4,5]])
    myObj.run()

代码说明

  • mocker.patch.object(myObj, 'a2', ...)会替换myObj实例中a2属性的获取逻辑,每次访问myObj.a2时,会依次返回side_effect列表中的元素。
  • 第一次调用myObj.run()时,self.a2会返回[2,3],遍历输出val in a2: 2和val in a2: 3;如果再次调用myObj.run(),self.a2会返回[3,4],以此类推。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:55:03