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

