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

Python单元测试中requests.Session.get调用断言失败的问题排查

Python单元测试中requests.Session.get调用断言失败的问题排查

我来帮你分析一下这个断言失败的核心问题,主要是测试代码里的mock逻辑没理顺,导致被patch的get方法根本没被调用到,具体问题和修正方案如下:

原测试代码的问题点

  • Mock对象不匹配:你用@patch.object(Session, 'get') patch了Session类的get方法,但测试时却自己创建了一个独立的mock_session = Mock()并传给fetch_data_with_session。这个自定义的mock_session和被patch的Session类完全无关,函数里调用的是mock_session.get,而非你patch的那个mock_get,所以断言自然找不到对应的调用记录。
  • 语法错误:测试末尾的self.assertEqual = (outages_data, data)是错误的赋值写法,正确的断言语法应该是self.assertEqual(实际值, 期望值)。

修正方案一:直接Mock传入的Session对象

这种思路更贴合你的函数设计(函数接收外部传入的session),直接给mock_session的get方法设置返回值即可:

import unittest
from main import fetch_data_with_session
from unittest.mock import Mock


class TestingGet(unittest.TestCase):
    
    def test_fetch(self):
        # 模拟返回的JSON数据
        data = {
                "id": "0001",
                "name": "John Doe",
                }
        # 构造mock响应对象
        mock_response = Mock()
        mock_response.json.return_value = data
        
        # 创建mock Session对象,并指定它的get方法返回mock响应
        mock_session = Mock()
        mock_session.get.return_value = mock_response
        
        # 调用待测试函数
        retrieved_get_data = fetch_data_with_session(mock_session, "https://example-name/v1/", "0001")
        
        # 断言get方法被正确调用
        mock_session.get.assert_called_with("https://example-name/v1/0001")
        
        # 断言返回数据符合预期
        self.assertEqual(retrieved_get_data, data)

if __name__ == '__main__':
    unittest.main()

修正方案二:使用Patch模拟Session类的get方法

如果你想通过patch来实现,需要确保函数使用的是被patch后的Session实例,而不是自定义的mock对象:

import unittest
from requests import Session
from main import fetch_data_with_session
from unittest.mock import Mock, patch


class TestingGet(unittest.TestCase):
    
    @patch.object(Session, 'get')
    def test_fetch(self, mock_get):
        # 模拟返回的JSON数据
        data = {
                "id": "0001",
                "name": "John Doe",
                }
        # 构造mock响应对象
        mock_response = Mock()
        mock_response.json.return_value = data
        
        # 指定被patch的get方法返回mock响应
        mock_get.return_value = mock_response
        
        # 创建真正的Session实例(此时它的get方法已被替换为mock_get)
        session = Session()
        
        # 调用待测试函数
        retrieved_get_data = fetch_data_with_session(session, "https://example-name/v1/", "0001")
        
        # 断言get方法被正确调用
        mock_get.assert_called_with("https://example-name/v1/0001")
        
        # 断言返回数据符合预期
        self.assertEqual(retrieved_get_data, data)

if __name__ == '__main__':
    unittest.main()

你编辑后代码的问题说明

你更新后的代码里把mock_get直接传给函数当session参数,然后调用mock_get.get.assert_called_with,这是错误的——mock_get本身就是被patch的get方法,并非Session对象,所以不需要再调用.get,直接用mock_get.assert_called_with即可,同时正确的session应该是被patch后的Session实例。

备注:内容来源于stack exchange,提问作者and

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 12:07:58