如何为Python中任意调用的requests.get添加全局Mock?
全局Mock requests.get 覆盖MyClass所有调用的可行方案
方法1:使用unittest.mock.patch全局替换
这是Python标准库自带的方案,无需额外安装依赖,只要确保patch路径正确,就能全局覆盖所有requests.get调用。
示例代码
假设你的业务代码在my_module.py:
# my_module.py import requests class MyClass: def myfunc1(self, url): resp = requests.get(url) return resp.json() def myfunc2(self, url): resp = requests.get(url) return resp.status_code
对应的测试代码test_my_module.py:
import unittest from unittest.mock import patch, MagicMock from my_module import MyClass class TestMyClass(unittest.TestCase): # 用装饰器全局patch整个测试类内的requests.get @patch('requests.get') def test_all_methods(self, mock_get): # 配置Mock的返回响应 mock_resp = MagicMock() mock_resp.json.return_value = {"data": "mocked"} mock_resp.status_code = 200 mock_get.return_value = mock_resp # 测试myfunc1 obj = MyClass() result1 = obj.myfunc1("https://any-url.com") self.assertEqual(result1, {"data": "mocked"}) mock_get.assert_called_once_with("https://any-url.com") # 重置mock计数,测试myfunc2 mock_get.reset_mock() result2 = obj.myfunc2("https://another-url.com") self.assertEqual(result2, 200) mock_get.assert_called_once_with("https://another-url.com") if __name__ == '__main__': unittest.main()
方法2:使用requests-mock全局适配器
如果更习惯用requests生态的mock工具,正确挂载全局适配器后,所有requests.get会自动走mock逻辑。
示例代码
先安装依赖:pip install requests-mock
测试代码:
import unittest import requests_mock from my_module import MyClass class TestMyClass(unittest.TestCase): # 用requests-mock的装饰器注入mock对象 @requests_mock.Mocker() def test_all_methods(self, mock): # 匹配所有URL,返回统一的mock响应 mock.get(requests_mock.ANY, json={"data": "mocked"}, status_code=200) obj = MyClass() # 验证myfunc1 result1 = obj.myfunc1("https://example.com") self.assertEqual(result1, {"data": "mocked"}) # 验证myfunc2 result2 = obj.myfunc2("https://test.com") self.assertEqual(result2, 200) if __name__ == '__main__': unittest.main()
常见失效原因排查
- Patch路径错误:如果业务代码里是
from requests import get而非import requests,需要patch的是业务模块内的get引用(比如@patch('my_module.get')),而非requests.get——Python导入会把对象绑定到当前模块,必须patch实际调用的那个引用。 - Requests-mock匹配规则过严:如果仅指定了特定URL,而测试中调用的URL不匹配,会导致mock失效,用
requests_mock.ANY可匹配所有请求。 - 未配置Mock返回值:如果只mock了
requests.get但未设置返回响应的json()或status_code,调用时会抛出属性错误,必须给Mock对象配置必要的返回属性。
内容的提问来源于stack exchange,提问作者Eitan
相关产品推荐
相关产品推荐

