Unittest mock的return_value不同场景表现不一致,原因是什么?
Python unittest mock 中 return_value 生效逻辑差异说明
核心本质
所有差异都来自于你mock的层级是否匹配代码实际的调用链路:
实际代码的调用逻辑是两级:
- 调用
requests.get(url)函数,得到响应对象 - 读取该响应对象的
status_code属性
第一个示例运行正常的原因
你的被测函数直接返回requests.get(url)的结果,你用patch('requests.get', return_value='Hello World!')直接给requests.get函数的调用返回值设为了固定字符串,完全匹配调用逻辑,所以断言通过。
第二个示例运行报错的原因
你写的requests.get.status_code.return_value = 200是给**requests.get这个Mock函数对象本身**加了status_code属性的返回规则,但实际代码根本不会读取requests.get.status_code,只会读取requests.get(url)(也就是函数调用后返回的新Mock对象)的status_code属性,这个属性你没有做任何赋值,所以返回的是默认生成的Mock实例,和预期的200不匹配,触发报错。
调整后示例运行正常的原因
mock_request.return_value对应的就是requests.get(url)调用后返回的结果对象,你直接给这个结果对象的status_code属性赋值为200,完全匹配实际代码的调用链路,所以断言通过。
内容的提问来源于stack exchange,提问作者TobaSko
相关产品推荐
相关产品推荐

