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

