FastAPI依赖覆盖失效排查:测试环境无法切换数据库地址
FastAPI依赖覆盖不生效的原因及解决方法
问题核心
测试时尝试将生产数据库地址切换为测试环境,但依赖覆盖始终不生效,测试代码仍调用生产库。
根本原因
你的代码里存在两个完全独立的get_db函数:
routes/routes.py里本地定义了一个get_db,路由函数create_users依赖的就是这个函数- 测试代码
test_main.py里导入的是models.database中的get_db,并且覆盖的也是这个函数
FastAPI的依赖覆盖是基于函数对象匹配的,这两个get_db是不同的对象,所以你覆盖的是一个没被路由使用的依赖,自然不会生效。
另外,虽然main.py把models.database.get_db加到了app的全局依赖里,但路由函数create_users自己显式指定了db = Depends(get_db),这里的get_db是路由模块本地的,全局依赖的覆盖也不会影响这个路由的数据库连接。
修复步骤
方案1:统一get_db定义(推荐)
把routes/routes.py里的本地get_db移除,统一使用models.database里的定义:
修改routes/routes.py:
# 从models.database导入统一的get_db from models.database import get_db # 移除本地的get_db定义 @apps.post('/api/user',response_model = List[Return_User_type]) async def create_users(user: User,db = Depends(get_db)): user = dict(user) # hash 암호화 user["password"] = pwd_context.hash(user["password"]) db.user.insert_one(user) data = [db.user.find_one({"user_id":user["user_id"]})] serialize_objId(data) return JSONResponse(status_code = 202, content = data)
这样测试代码里原来的覆盖逻辑就会生效,因为路由和测试用的都是同一个models.database.get_db函数。
方案2:覆盖路由模块里的get_db
如果不想移动get_db的定义,测试代码里要导入路由模块的get_db并覆盖:
修改test_main.py:
from .main import app from routes.routes import apps, get_db # 导入routes里的get_db from pymongo import MongoClient from fastapi.testclient import TestClient async def override_get_db(): db = MongoClient("mongodb://222.222.2.2:54254/test") try: yield db.local finally: db.close() app.dependency_overrides[get_db] = override_get_db # 覆盖routes里的get_db client = TestClient(app) def test_read_main(): response = client.get('/') assert response.status_code == 200 def test_user_create(): response = client.post('/api/user',headers = {'accept': 'application/json', 'Content-Type': 'application/json'}, json = { "name": "jae5yeon", "user_id": "aavc1234", "email": "kkg@naver.com", "password": "12a3456", "nickname": "user1r", "disabled": "False" } ) assert response.status_code == 202
额外注意点
- 确认测试环境MongoDB的地址和端口是否正确(测试代码里写的是54254,需求里是54321,注意是否为笔误)
- 测试前可以打印
app.dependency_overrides确认覆盖是否成功,比如在测试函数中添加print(app.dependency_overrides)
内容的提问来源于stack exchange,提问作者Care
相关产品推荐
相关产品推荐

