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

如何在pytest中覆写APIRouter级别的依赖?

覆写FastAPI Router依赖以跳过JWT认证测试

这里有几种实用的方法可以在测试时跳过router的JWT认证依赖:

方法1:使用FastAPI的dependency_overrides

FastAPI内置了依赖覆写机制,可以直接替换指定的依赖类:

from fastapi import FastAPI
from fastapi.testclient import TestClient
from cud import router
from auth.jwt_bearer_default import JWTBearerDefault

# 创建测试用的FastAPI实例并挂载router
app = FastAPI()
app.include_router(router)

# 定义一个空的模拟依赖,替代JWT认证逻辑
def mock_jwt_auth():
    return None

# 覆写JWTBearerDefault依赖
app.dependency_overrides[JWTBearerDefault] = mock_jwt_auth

# 初始化测试客户端
client = TestClient(app)

# 测试用例
def test_endpoint():
    response = client.post("/endpoint", params={"dataSourceCode": "test_ds_code"})
    assert response.status_code == 200
    assert response.json() == "test_ds_code"

方法2:挂载router时直接覆盖依赖列表

在测试代码中挂载router时,直接传入空的dependencies参数,覆盖原router的全局依赖:

from fastapi import FastAPI
from fastapi.testclient import TestClient
from cud import router

app = FastAPI()
# 挂载router时替换掉原有的JWT依赖
app.include_router(router, dependencies=[])

client = TestClient(app)

def test_endpoint():
    response = client.post("/endpoint", params={"dataSourceCode": "test_ds_code"})
    assert response.status_code == 200
    assert response.json() == "test_ds_code"

方法3:修改原模块为可配置依赖(适合长期测试)

如果需要频繁测试这个router,可以修改原模块的依赖定义,让它支持替换:

修改后的cud.py:

from fastapi import APIRouter, Depends
from auth.jwt_bearer_default import JWTBearerDefault

# 封装依赖获取逻辑,方便测试替换
def get_auth_dependency():
    return JWTBearerDefault()

router = APIRouter(
    prefix="",
    dependencies=[Depends(get_auth_dependency)]
)

@router.post('/endpoint')
def some_function(dataSourceCode: str):
    return dataSourceCode

测试代码:

from fastapi import FastAPI
from fastapi.testclient import TestClient
from cud import router, get_auth_dependency

# 模拟空的认证依赖
def mock_auth_dependency():
    return None

# 替换router的依赖
router.dependencies = [Depends(mock_auth_dependency)]

app = FastAPI()
app.include_router(router)

client = TestClient(app)

def test_endpoint():
    response = client.post("/endpoint", params={"dataSourceCode": "test_ds_code"})
    assert response.status_code == 200
    assert response.json() == "test_ds_code"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:16:11