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

如何在pytest中通过Mock POST请求测试Payload?

问题

我有一个使用requests.post()方法向外部API发送Payload的函数,想要在测试中验证该Payload是否满足特定条件。因此需要Mock requests的post方法并在测试函数中捕获Payload,理想情况是不新增外部依赖仅使用pytest,若无法实现也可灵活处理。已有类似问题但未覆盖该场景,参考示例如下:

def mock_request_post(**kwargs):
    # check if kwargs satisfy test conditions

def test_api(args):
    # mock requests module with `mock_request_post`
    # make api call
解决方案

方法一:用pytest自带的monkeypatch(无额外依赖)

直接用pytest内置的monkeypatch fixture替换requests.post,在mock函数里直接捕获Payload并做验证:

import requests
from your_module import your_function  # 导入你要测试的发请求函数

def mock_post(**kwargs):
    # 根据实际传参方式提取Payload:用json参数传就取json,用data参数传就取data
    payload = kwargs.get("json")
    # payload = kwargs.get("data")  # 若用data传Payload则启用该行
    
    # 这里写你的验证逻辑,比如检查必填字段、值是否符合预期
    assert payload is not None, "Payload不能为空"
    assert payload.get("user_id") == 123, "user_id不符合预期值"
    
    # 返回模拟响应,避免原函数因无真实响应报错
    class MockResponse:
        status_code = 200
        def json(self):
            return {"code": 0, "msg": "success"}
    return MockResponse()

def test_your_function(monkeypatch):
    # 替换requests.post为自定义的mock函数
    monkeypatch.setattr(requests, "post", mock_post)
    
    # 调用要测试的函数,触发post请求
    your_function()

方法二:用Python标准库unittest.mock(pytest兼容,无额外依赖)

用unittest.mock.patch来Mock requests.post,通过mock对象的调用记录提取Payload:

import requests
from unittest.mock import patch
from your_module import your_function  # 导入要测试的函数

def test_your_function_with_mock():
    with patch("requests.post") as mock_post:
        # 设置mock的返回值,保证原函数能正常执行
        mock_post.return_value.status_code = 200
        mock_post.return_value.json.return_value = {"code": 0, "msg": "success"}
        
        # 调用要测试的函数
        your_function()
        
        # 获取mock被调用时的参数详情
        call_details = mock_post.call_args
        # 根据实际传参方式提取Payload
        payload = call_details.kwargs.get("json")
        
        # 验证Payload
        assert payload is not None
        assert payload["user_id"] == 123

补充说明

  • 两种方法都无需额外安装依赖:前者用pytest自带的monkeypatch,后者用Python内置的标准库,pytest完全兼容。
  • 必须根据你实际代码传递Payload的方式(json或data参数)调整提取逻辑,否则无法捕获正确内容。
  • 模拟响应时,只需保证原函数能正常执行即可,返回的响应结构可根据原函数的处理逻辑灵活调整。

内容的提问来源于stack exchange,提问作者Ayush Chaurasia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 13:32:41