根据 FastAPI official documentation ,覆盖测试依赖项的推荐方法是在所有测试运行之前全局执行:
async def override_dependency(q: Optional[str] = None):
return {"q": q, "skip": 5, "limit": 10}
app.dependency_overrides[common_parameters] = override_dependency
def test_override_in_items():
response = client.get("/items/")
assert response.status_code == 200
assert response.json() == {
"message": "Hello Items!",
"params": {"q": None, "skip": 5, "limit": 10},
}
def test_override_in_items_with_q():
response = client.get("/items/?q=foo")
assert response.status_code == 200
assert response.json() == {
"message": "Hello Items!",
"params": {"q": "foo", "skip": 5, "limit": 10},
}
但这允许您在整个测试运行中只覆盖一次依赖项。如果我需要为每个测试提供不同的依赖项怎么办?覆盖测试主体内部的依赖关系并在测试完成后重置它们是否安全?像这样
def test_override_in_items():
app.dependency_overrides[common_parameters] = override_dependency
response = client.get("/items/")
assert response.status_code == 200
assert response.json() == {
"message": "Hello Items!",
"params": {"q": None, "skip": 5, "limit": 10},
}
app.dependency_overrides[common_parameters] = {}
像上面的例子那样做有什么缺点?
这就是我在测试中使用自己来覆盖依赖项的方法。您必须将其用作带有
with
语句的上下文管理器(参见下面的示例)。进入上下文后,它会保存遇到的现有覆盖。这些将在退出上下文时恢复。您可以在测试中像这样使用它:
或者可以将其用作 pytest 中的固定装置: