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

FastAPI接口Pytest测试无法断言HTTPException 500状态码求助

解决FastAPI认证接口测试无法断言500状态码的问题

问题根源

  1. 测试用例直接将authentication_router传入TestClient,但TestClient需要接收完整的FastAPI应用实例而非单独路由对象,导致依赖注入系统无法正常解析AuthenticationService,引发未预期的异常行为。
  2. 未对AuthenticationService进行Mock,测试时调用真实服务逻辑,无法精准控制返回结果模拟无效凭据场景。

解决方案

1. 修正TestClient创建方式

先创建临时FastAPI应用并挂载认证路由,再用该应用实例初始化TestClient。

2. Mock AuthenticationService依赖

通过pytest-mock控制AuthenticationService.authenticate方法的返回值,精准模拟不同认证场景。

修改后的测试代码

from fastapi import FastAPI
import pytest
from httpx import TestClient
from your_module import authentication_router, AuthenticationService, ApplicationConfiguration

test_data = ApplicationConfiguration()

@pytest.fixture
def client(mocker):
    # 创建临时FastAPI应用并挂载路由
    app = FastAPI()
    app.include_router(authentication_router)
    
    # Mock AuthenticationService实例
    mock_auth_service = mocker.Mock(spec=AuthenticationService)
    # 覆盖依赖注入,使用Mock替代真实服务
    app.dependency_overrides[AuthenticationService] = lambda: mock_auth_service
    
    return TestClient(app), mock_auth_service

def test_valid_authentication(client):
    client, mock_auth_service = client
    # 模拟有效凭据返回令牌
    mock_auth_service.authenticate.return_value = "valid_test_token"
    
    authentication_data = {"username": test_data.TEST_USER, "password": test_data.TEST_PASSWORD}
    response = client.post("/authenticate", json=authentication_data)
    
    assert response.status_code == 200
    assert "access_token" in response.json()
    assert response.json()["access_token"] == "valid_test_token"

def test_invalid_authentication(client):
    client, mock_auth_service = client
    # 模拟无效凭据返回None
    mock_auth_service.authenticate.return_value = None
    
    authentication_data = {"username": "invalid_user", "password": "invalid_password"}
    response = client.post("/authenticate", json=authentication_data)
    
    assert response.status_code == 500
    assert "401: Invalid credentials" in response.json()["detail"]

说明

  • 依赖覆盖app.dependency_overrides[AuthenticationService]确保测试时使用Mock实例,避免调用真实外部服务。
  • 原接口中将401转换为500的逻辑本身是生效的,测试失败的核心原因是TestClient初始化错误和未Mock依赖。

内容的提问来源于stack exchange,提问作者crowley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:35:23