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

