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

