You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 06:30:04