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

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)
      

问题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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:37:13