Probando Dependencias con Overrides¶
🌐 Traducción por IA y humanos
Esta traducción fue hecha por IA guiada por humanos. 🤝
Podría tener errores al interpretar el significado original, o sonar poco natural, etc. 🤖
Puedes mejorar esta traducciónayudándonos a guiar mejor al LLM de IA.
Sobrescribir dependencias durante las pruebas¶
Hay algunos escenarios donde podrías querer sobrescribir una dependencia durante las pruebas.
No quieres que la dependencia original se ejecute (ni ninguna de las sub-dependencias que pueda tener).
En cambio, quieres proporcionar una dependencia diferente que se usará solo durante las pruebas (posiblemente solo algunas pruebas específicas), y que proporcionará un valor que pueda ser usado donde se usó el valor de la dependencia original.
Casos de uso: servicio externo¶
Un ejemplo podría ser que tienes un proveedor de autenticación externo al que necesitas llamar.
Le envías un token y te devuelve un usuario autenticado.
Este proveedor podría estar cobrándote por cada request, y llamarlo podría tomar más tiempo adicional que si tuvieras un usuario mock fijo para los tests.
Probablemente quieras probar el proveedor externo una vez, pero no necesariamente llamarlo para cada test que se realice.
En este caso, puedes sobrescribir la dependencia que llama a ese proveedor y usar una dependencia personalizada que devuelva un usuario mock, solo para tus tests.
Usa el atributoapp.dependency_overrides¶
Para estos casos, tu aplicaciónFastAPI tiene un atributoapp.dependency_overrides, es un simpledict.
Para sobrescribir una dependencia para las pruebas, colocas como clave la dependencia original (una función), y como valor, tu dependencia para sobreescribir (otra función).
Y entoncesFastAPI llamará a esa dependencia para sobreescribir en lugar de la dependencia original.
fromtypingimportAnnotatedfromfastapiimportDepends,FastAPIfromfastapi.testclientimportTestClientapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:Annotated[dict,Depends(common_parameters)]):return{"message":"Hello Items!","params":commons}@app.get("/users/")asyncdefread_users(commons:Annotated[dict,Depends(common_parameters)]):return{"message":"Hello Users!","params":commons}client=TestClient(app)asyncdefoverride_dependency(q:str|None=None):return{"q":q,"skip":5,"limit":10}app.dependency_overrides[common_parameters]=override_dependencydeftest_override_in_items():response=client.get("/items/")assertresponse.status_code==200assertresponse.json()=={"message":"Hello Items!","params":{"q":None,"skip":5,"limit":10},}deftest_override_in_items_with_q():response=client.get("/items/?q=foo")assertresponse.status_code==200assertresponse.json()=={"message":"Hello Items!","params":{"q":"foo","skip":5,"limit":10},}deftest_override_in_items_with_params():response=client.get("/items/?q=foo&skip=100&limit=200")assertresponse.status_code==200assertresponse.json()=={"message":"Hello Items!","params":{"q":"foo","skip":5,"limit":10},}🤓 Other versions and variants
Tip
Prefer to use theAnnotated version if possible.
fromfastapiimportDepends,FastAPIfromfastapi.testclientimportTestClientapp=FastAPI()asyncdefcommon_parameters(q:str|None=None,skip:int=0,limit:int=100):return{"q":q,"skip":skip,"limit":limit}@app.get("/items/")asyncdefread_items(commons:dict=Depends(common_parameters)):return{"message":"Hello Items!","params":commons}@app.get("/users/")asyncdefread_users(commons:dict=Depends(common_parameters)):return{"message":"Hello Users!","params":commons}client=TestClient(app)asyncdefoverride_dependency(q:str|None=None):return{"q":q,"skip":5,"limit":10}app.dependency_overrides[common_parameters]=override_dependencydeftest_override_in_items():response=client.get("/items/")assertresponse.status_code==200assertresponse.json()=={"message":"Hello Items!","params":{"q":None,"skip":5,"limit":10},}deftest_override_in_items_with_q():response=client.get("/items/?q=foo")assertresponse.status_code==200assertresponse.json()=={"message":"Hello Items!","params":{"q":"foo","skip":5,"limit":10},}deftest_override_in_items_with_params():response=client.get("/items/?q=foo&skip=100&limit=200")assertresponse.status_code==200assertresponse.json()=={"message":"Hello Items!","params":{"q":"foo","skip":5,"limit":10},}Consejo
Puedes sobreescribir una dependencia utilizada en cualquier lugar de tu aplicaciónFastAPI.
La dependencia original podría ser utilizada en unapath operation function, unpath operation decorator (cuando no usas el valor de retorno), una llamada a.include_router(), etc.
FastAPI todavía podrá sobrescribirla.
Entonces puedes restablecer las dependencias sobreescritas (eliminarlas) configurandoapp.dependency_overrides para que sea undict vacío:
app.dependency_overrides={}Consejo
Si quieres sobrescribir una dependencia solo durante algunos tests, puedes establecer la sobrescritura al inicio del test (dentro de la función del test) y restablecerla al final (al final de la función del test).







