FastApi教程|使用替代测试依赖项

发表时间:2020-03-09

在测试过程中覆盖依赖项

在某些情况下,您可能需要在测试期间覆盖依赖关系。

您不希望原始依赖项运行(也不希望它具有任何子依赖项)。

相反,您想提供一个仅在测试期间使用的其他依赖项(可能仅在某些特定测试中),并且将提供一个可以在使用原始依赖项的值的地方使用的值。

用例:外部服务

例如,您有一个需要调用的外部身份验证提供程序。

您向它发送一个令牌,它返回一个经过身份验证的用户。

与您有固定的模拟用户进行测试相比,此提供程序可能会按请求向您收费,并且调用它可能会花费一些时间。

您可能只想测试一次外部提供程序,但不必在每次运行的测试中都调用它。

在这种情况下,您可以覆盖调用该提供程序的依赖项,并使用仅针对您的测试返回模拟用户的自定义依赖项。

用例:测试数据库

其他示例可能是您仅将特定数据库用于测试。

您的正常依赖关系将返回数据库会话。

但是,在每次测试之后,您可能希望回滚所有操作或删除数据。

或者您可能想在测试运行之前更改数据,等等。

在这种情况下,您可以使用依赖项替代来返回 自定义 数据库会话,而不是通常使用的会话。

使用 app.dependency_overrides 属性

对于这些情况,您的 FastAPI 应用程序具有一个属性 app.dependency_overrides ,它很简单 dict

要覆盖测试的依赖关系,请将原始依赖关系(一个函数)作为键,并将值覆盖(另一个​​函数)作为值。

然后, FastAPI 将调用该替代而不是原始依赖项。

from fastapi import Depends, FastAPI
from fastapi.testclient import TestClient

app = FastAPI()


async def common_parameters(q: str = None, skip: int = 0, limit: int = 100):
    return {"q": q, "skip": skip, "limit": limit}


@app.get("/items/")
async def read_items(commons: dict = Depends(common_parameters)):
    return {"message": "Hello Items!", "params": commons}


@app.get("/users/")
async def read_users(commons: dict = Depends(common_parameters)):
    return {"message": "Hello Users!", "params": commons}


client = TestClient(app)


async def override_dependency(q: 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_with_params():
    response = client.get("/items/?q=foo&skip=100&limit=200")
    assert response.status_code == 200
    assert response.json() == {
        "message": "Hello Items!",
        "params": {"q": "foo", "skip": 5, "limit": 10},
    }

小费

您可以为 FastAPI 应用程序中 任何地方使用的依赖项设置依赖项替代 。

原始依赖项可用于 路径操作函数 路径操作装饰器 (不使用返回值时), .include_router() 调用等。

FastAPI仍然可以覆盖它。

然后,您可以通过设置 app.dependency_overrides 为空值 来重置您的替代(删除它们) dict

app.dependency_overrides = {}

小费

如果仅在某些测试中要覆盖依赖项,则可以在测试开始时(在测试功能内部)设置替代,并在测试结束时(在测试功能结束时)将其重置。

文章来源互联网,如有侵权,请联系管理员删除。邮箱:417803890@qq.com / QQ:417803890

微配音

Python Free

邮箱:417803890@qq.com
QQ:417803890

皖ICP备19001818号
© 2019 copyright www.pythonf.cn - All rights reserved

微信扫一扫关注公众号:

联系方式

Python Free