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

如何在Python复杂类结构中Mock requests.get()调用?

如何Mock Client类中_make_request内的requests.get()接口请求

核心思路

你需要用Python unittest.mock.patch 直接拦截requests.get的调用(或精准定位到Client类所在模块内的requests.get),模拟它的返回值,这样_make_request调用requests.get时会使用你预设的模拟数据,而非发起真实网络请求。

具体实现方式

方式一:全局Mock requests.get(简单直接)

如果测试用例仅需模拟该请求,无其他requests调用冲突,可直接全局patch:

from unittest.mock import patch, Mock
import unittest
from your_module import MSTeamsHandler, Client  # 替换为你的实际模块路径

class TestMSTeamsHandler(unittest.TestCase):
    @patch('requests.get')
    def test_get_chat_via_mocked_requests(self, mock_get):
        # 构造符合真实接口返回结构的Mock响应
        mock_response = Mock()
        mock_response.status_code = 200
        mock_response.json.return_value = {
            "id": "12345",
            "topic": "Test Chat",
            "members": ["user1", "user2"]
        }
        mock_get.return_value = mock_response

        # 初始化实例并调用方法
        handler = MSTeamsHandler()
        client = handler.connect()
        chat_data = client.get_chat(chat_id="test-id")

        # 断言结果符合预期
        self.assertEqual(chat_data["id"], "12345")
        # 可选:验证requests.get的调用参数是否正确
        mock_get.assert_called_once_with(
            "https://your-actual-api-url/chat/test-id",
            headers={"Authorization": "Bearer your-token"}
        )

方式二:精准Mock Client模块内的requests.get(推荐)

若项目中多处使用requests,为避免全局Mock影响其他测试,建议精准patchClient类所在模块导入的requests:

from unittest.mock import patch, Mock
import unittest
from your_module import MSTeamsHandler
from client_module import Client  # Client类所在模块

class TestMSTeamsHandler(unittest.TestCase):
    @patch('client_module.requests.get')  # 路径指向Client所在模块的requests
    def test_get_chat_with_precise_mock(self, mock_get):
        mock_response = Mock()
        mock_response.status_code = 200
        mock_response.json.return_value = {"id": "67890", "topic": "Another Chat"}
        mock_get.return_value = mock_response

        handler = MSTeamsHandler()
        client = handler.connect()
        chat_data = client.get_chat(chat_id="another-id")

        self.assertEqual(chat_data["topic"], "Another Chat")
        # 验证调用参数
        mock_get.assert_called_once_with(
            "https://api.microsoft.com/v1/chats/another-id",
            timeout=30
        )

方式三:Mock _make_request方法的返回(替代方案)

若不想直接Mockrequests.get,也可以MockClient类的_make_request方法,直接返回预设数据:

from unittest.mock import patch, Mock
import unittest
from your_module import MSTeamsHandler

class TestMSTeamsHandler(unittest.TestCase):
    @patch('your_module.Client._make_request')  # 替换为Client所在模块路径
    def test_get_chat_via_mocked_make_request(self, mock_make_request):
        mock_make_request.return_value = {
            "id": "54321",
            "topic": "Mocked Chat"
        }

        handler = MSTeamsHandler()
        client = handler.connect()
        chat_data = client.get_chat(chat_id="mock-id")

        self.assertEqual(chat_data["id"], "54321")
        # 验证_make_request的调用参数
        mock_make_request.assert_called_once_with(
            method="GET",
            url="https://your-api-url/chat/mock-id"
        )

关键注意事项

  • patch路径正确性:patch的路径必须是被测试代码中导入requests的路径,而非测试文件内的导入路径。比如Client类在client.py中导入requests,就要patchclient.requests.get。
  • 模拟响应结构匹配:确保mock_response.json.return_value的结构与真实API返回一致,保证get_chat处理后的数据符合预期。
  • 调用验证(可选但推荐):通过assert_called_once_with验证requests.get或_make_request的调用参数,确保代码逻辑符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:21