FastAPI接口测试问题:Mock未触发及AttributeError报错
FastAPI接口测试问题解决方案
问题1:AttributeError: 'State' object has no attribute 'session'
- 原因:接口逻辑依赖
request.state.session,但测试请求的state中未初始化该属性。 - 解决方法:
- 若接口通过依赖注入获取session,用
app.dependency_overrides替换对应依赖,返回Mock的session对象:from main import get_session # 假设这是获取session的依赖函数 def mock_get_session(): mock_session = MagicMock() # 按需设置mock_session的属性 return mock_session app.dependency_overrides[get_session] = mock_get_session - 若直接操作request.state,可在测试中添加临时中间件注入session:
async def add_mock_session(request, call_next): request.state.session = MagicMock() response = await call_next(request) return response app.middleware("http")(add_mock_session)
- 若接口通过依赖注入获取session,用
问题2:Mock的get_session_information未触发,实际调用原方法
- 原因:
@patch路径错误。unittest.mock.patch需要patch方法被调用位置的引用,而非方法定义的位置。比如若main.py中通过from mymodule import get_session_information导入并调用,实际调用的是main模块内的引用,此时需patchmain.get_session_information而非mymodule.get_session_information。 - 解决方法:修改patch的目标路径为方法被调用模块中的引用。
修改后的完整测试代码
from unittest.mock import patch, MagicMock from fastapi.testclient import TestClient from main import app, get_session # 导入接口依赖的session获取函数 from mymodule import SessionInformationResult test_client = TestClient(app) # 覆盖session依赖 def mock_get_session(): mock_session = MagicMock() # 按需设置session属性 return mock_session app.dependency_overrides[get_session] = mock_get_session # 修正patch路径为方法被调用的模块 @patch('main.get_session_information') def test_isunthere(mock_get_session_information): mock_session_info = SessionInformationResult( session_handle=SessionInformationResult.SessionHandle({"username_bool": True}), user_id="test_user_id", session_data={}, expiry=81, access_token_payload={"username_bool": True}, time_created=637, ) mock_get_session_information.return_value = mock_session_info response = test_client.get("/isunthere") assert response.status_code == 200 assert response.json() == True
内容的提问来源于stack exchange,提问作者Prashanth Bairu
相关产品推荐
相关产品推荐

