如何用side_effect模拟请求响应?遇AttributeError问题求助
解决Mock请求响应时的AttributeError问题
你之前的问题出在返回的是字典,而业务代码里是通过.status_code属性访问响应状态,字典没有这个属性,所以报错。正确的做法是返回带有对应属性的Mock对象,而不是字典。
正确实现方式
使用unittest.mock.Mock创建模拟的响应对象,给每个对象设置status_code属性,然后把这些对象放进side_effect列表里:
from unittest.mock import Mock # 创建模拟响应对象 response_404 = Mock() response_404.status_code = 404 # 如果你的代码需要调用response.json(),可以额外设置 response_404.json.return_value = {"error": "资源不存在"} response_200 = Mock() response_200.status_code = 200 response_200.json.return_value = {"data": "请求成功"} # 赋值给mock的side_effect mock_method.side_effect = [response_404, response_200]
简化写法
也可以直接用Mock的关键字参数一步创建:
from unittest.mock import Mock mock_method.side_effect = [ Mock(status_code=404, json=Mock(return_value={"error": "资源不存在"})), Mock(status_code=200, json=Mock(return_value={"data": "请求成功"})) ]
为什么之前的写法错误
- 第一种写法返回字典:
{"status_code": 404}是字典,只能通过["status_code"]访问,而你的代码用的是.status_code属性访问,自然报错。 - 第二种写法直接给
side_effect加属性:初始时mock_method.side_effect是None,给None设置status_code当然会触发NoneType的属性错误。
内容的提问来源于stack exchange,提问作者anielsen
相关产品推荐
相关产品推荐

