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

FastAPI测试中路由依赖覆盖失效问题及解决方案

FastAPI依赖替换测试失败问题及解决方法

业务代码实现

创建产品路由

@router.post("/product", tags=["product"])
async def create_product(request: Request,
                         id_generator: IdGenerator = Depends(get_id_generator)):

ID生成器依赖函数

def get_id_generator() -> IdGenerator:
    return UUIDIdGenerator()

测试遇到的问题

测试阶段希望用SomeOtherIdGenerator替代默认的UUIDIdGenerator,但执行测试后断言ID为预期值时失败,返回的依然是UUID格式的ID:

Expected :'some known value'
Actual   :'06864d25-f88c-4382-9d1a-08c8e6951885'

错误的测试代码

最初编写的测试代码如下,尝试过带lambda和不带lambda的写法,均无法生效:

@pytest.fixture
def test_id_generator():
    return SomeOtherIdGenerator()

@pytest.mark.asyncio
async def test_create_product(test_id_generator):
    data = '{ "a": "b" }'
    app.dependency_overrides['get_id_generator'] = lambda : test_id_generator

    client = TestClient(app)
    response = client.post("/product", json={'stuff': data})
    assert response.status_code == 201
    response_data = response.json()
    assert response_data['id'] == "some known value"

正确解决方案

修改依赖覆盖的写法,使用依赖函数对象作为app.dependency_overrides的键,直接赋值测试用的生成器实例:

app.dependency_overrides[get_id_generator] = test_id_generator

不需要使用字符串'get_id_generator'作为键,也不需要用lambda表达式包裹实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 08:25:09