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

