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

如何为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()

常见失效原因排查

  1. Patch路径错误:如果业务代码里是from requests import get而非import requests,需要patch的是业务模块内的get引用(比如@patch('my_module.get')),而非requests.get——Python导入会把对象绑定到当前模块,必须patch实际调用的那个引用。
  2. Requests-mock匹配规则过严:如果仅指定了特定URL,而测试中调用的URL不匹配,会导致mock失效,用requests_mock.ANY可匹配所有请求。
  3. 未配置Mock返回值:如果只mock了requests.get但未设置返回响应的json()或status_code,调用时会抛出属性错误,必须给Mock对象配置必要的返回属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:10:16