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
相关产品推荐
相关产品推荐

