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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:12:49