如何使用pytest对requests.post请求进行模拟?
实现mock测试的具体方案
你需要先安装pytest-mock插件来使用内置的mocker fixture,安装命令:
pip install pytest-mock
根据你的测试目标,可以选择两种mock方式:
方案1:mock内部调用的requests.post
适合需要验证请求参数、模拟网络请求异常的场景,示例代码如下:
import requests from unittest.mock import MagicMock def test_amodel(mocker): # mock requests.post 避免真实发起网络请求 mock_post = mocker.patch("requests.post") # 自定义请求成功的返回值,按需调整 mock_resp = MagicMock() mock_resp.status_code = 200 mock_resp.json.return_value = {"status": "ok"} mock_post.return_value = mock_resp # 如果要模拟URL无效、请求报错的场景,替换上面的返回值配置为: # mock_post.side_effect = requests.exceptions.ConnectionError("无效URL") # 执行测试请求:注意reverse参数是urls.py中定义的路由name,不是完整URL,修正你原代码的写法 test_url = reverse("你的路由name") res = self.client.post(test_url, data={"请求参数": "对应值"}) # 断言结果符合预期 assert res.status_code == 200 # 可选:验证requests.post被正确调用,参数符合预期 mock_post.assert_called_once_with( url="你期望的AModel实例的url属性值", data={"传给some_method的data参数值"} )
方案2:直接mockAModel.some_method
适合不需要关心方法内部实现逻辑,只需验证方法被正确调用的场景,示例代码如下:
def test_amodel(mocker): # mock AModel的some_method方法,注意patch路径要和你代码中实际调用的路径一致 mock_method = mocker.patch("你的app名.models.AModel.some_method") # 自定义返回值 mock_method.return_value = {"status": "ok"} # 如果要模拟方法调用报错: # mock_method.side_effect = Exception("调用失败") # 执行测试请求 test_url = reverse("你的路由name") res = self.client.post(test_url, data={"请求参数": "对应值"}) # 断言 assert res.status_code == 200 # 验证方法被正确调用 mock_method.assert_called_once_with(data={"你期望的入参值"})
注意事项
patch路径需要和你代码中实际调用该方法/函数的位置保持一致,比如如果你的视图文件中是从models导入AModel再调用some_method,那么patch路径就应该写为你的app名.views.AModel.some_method。
你原测试代码里的fixture参数名写错了,pytest-mock提供的fixture是mocker不是mock,注意修正。
内容的提问来源于stack exchange,提问作者twingo
相关产品推荐
相关产品推荐

