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

Python中如何mock requests的Session对象及Response编写单元测试

问题原因

你当前的单元测试写法核心问题是mock对象的路径匹配错误,导致mock_req_get对象没有正确关联到download函数内实例化的Session对象的get方法,因此在赋值返回值时抛出异常。

正确实现方案

调整patch的目标为requests.Session.get即可,不需要额外单独导入Session类,修改后的测试用例如下:

import requests
from unittest.mock import patch
# 替换为你自己代码中download函数所在的模块导入路径
from your_module import download

@patch.object(requests.Session, 'get')
def test_download_success(mock_req_get):
    input_document = {"contentUri": "http://test"}
    # 构造模拟的Response对象
    mock_resp = requests.Response()
    mock_resp.status_code = 200
    # 直接给text属性赋值在部分requests版本中不生效,更稳妥的方式是给私有属性_content赋值二进制内容
    mock_resp._content = b"test"
    mock_req_get.return_value = mock_resp

    output = download(input_document)
    # 验证返回结果符合预期
    assert output["rawContent"] == "test"
    # 额外验证get方法的调用参数符合预期
    mock_req_get.assert_called_once_with("http://test", timeout=(5, 5))

异常场景测试参考

你可以通过设置side_effect模拟请求异常场景,验证错误分支逻辑是否正确:

@patch.object(requests.Session, 'get')
def test_download_fail(mock_req_get):
    input_document = {"contentUri": "http://test"}
    # 模拟请求抛出异常
    mock_req_get.side_effect = Exception("connect timeout")

    output = download(input_document)
    # 验证错误字段被正确填充
    assert "error" in output
    assert output["error"]["code"] == 500

注意事项

  • 如果你在download所在的模块中是通过from requests import Session单独导入了Session类,那么patch目标需要改为你自己模块内导入的Session对象,即@patch.object(your_module.Session, 'get')
  • 测试前确认你的测试文件可以正常导入download函数,导入路径错误也会导致mock不生效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:24:02