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
相关产品推荐
相关产品推荐

