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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:06:06