Python unittest中如何mock HTTP POST请求使其返回201跳过真实请求
问题解决方法
错误原因
你现有的测试代码存在核心问题,导致mock不生效、触发ValueError甚至发起真实请求报403:
- 没有正确配置
requests.post的默认返回值,你额外调用mock_post()和mock_post("some/url",...)的操作只会给这两次主动调用的返回值设置属性,不会影响生产代码调用requests.post时拿到的响应对象。 - 可能存在mock路径匹配错误的问题,如果patch的路径不对,mock不会生效,会真的发起网络请求。
- 没有给mock响应对象配置
json()方法的返回值,就算状态码符合要求,后续执行response.json()也会报错。
正确实现步骤
1. 确认patch路径
如果你的生产代码中是直接导入import requests,用requests.post发起请求,那@patch('requests.post')是正确的;如果生产代码是from requests import post直接导入post方法,需要将patch路径改为你的生产代码模块对应的post引用,比如生产代码在app.auth模块,就写@patch('app.auth.post')。
2. 正确配置mock响应
from unittest.mock import patch, ANY @patch('requests.post') def test_member(self, mock_post): # 配置post调用返回的默认响应对象 mock_resp = mock_post.return_value # 设置状态码为201 mock_resp.status_code = 201 # 配置json方法返回你需要的session token结构 mock_resp.json.return_value = {"session_key": "fake_test_token"} # 可选配置text属性,避免日志打印时报错 mock_resp.text = '{"session_key": "fake_test_token"}' # 调用待测试的member方法 test_org_id = "test_org_id" member(test_org_id) # 可选:断言post调用符合预期 expected_url = get_endpoint(test_org_id) + "/some/url/part" mock_post.assert_called_once_with( expected_url, data=ANY, headers={"Accept": "application/json"} ) # 后续补充你自己的业务逻辑断言
原写法错误说明
mock_post().status_code = 201:主动调用了一次mock对象,会被记录到mock的调用历史中,但不会修改默认返回值的属性,生产代码调用时拿到的mock响应状态码还是默认值,不会是201。mock_response = mock_post("some/url",...):同样是主动调用mock对象,仅对这一次调用的返回值生效,不会影响生产代码的调用结果。
内容的提问来源于stack exchange,提问作者maggie3003
相关产品推荐
相关产品推荐

