如何mock列表中的对象,正确获取signature_id属性值用于单元测试
问题根因
你之前的写法错误将signatures识别为可调用方法,额外加了.return_value配置,而实际业务代码中signature_request.signatures是直接读取的属性,返回列表后直接通过索引[0]取值,不需要调用。
正确解决方案
方案1:直接对属性赋值(适用90%以上普通场景)
直接给mock返回对象的signatures属性赋值为带signature_id属性的Mock对象列表即可:
# 写法1 分步构造 mock_signature_item = Mock() mock_signature_item.signature_id = "你要mock的signature_id值" send_request_mocked.return_value.signatures = [mock_signature_item] # 写法2 一行构造 send_request_mocked.return_value.signatures = [Mock(signature_id="你要mock的signature_id值")]
方案2:PropertyMock适配(仅适用于signatures是被@property装饰的类属性场景)
如果原对象的signatures是属性装饰器定义的计算属性,需要用PropertyMock配置:
from unittest.mock import PropertyMock type(send_request_mocked.return_value).signatures = PropertyMock( return_value=[Mock(signature_id="你要mock的signature_id值")] )
有效性验证
可以加一行测试代码快速验证mock是否生效:
test_instance = send_request_mocked() assert test_instance.signatures[0].signature_id == "你设置的mock值"
如果断言不报错则证明mock配置正确。
内容的提问来源于stack exchange,提问作者yesyouken
相关产品推荐
相关产品推荐

