committed by
GitHub
1 changed files with 103 additions and 0 deletions
@ -0,0 +1,103 @@ |
|||||
|
# Testando Dependências com Sobreposição (Overrides) |
||||
|
|
||||
|
## Sobrepondo dependências durante os testes |
||||
|
|
||||
|
Existem alguns cenários onde você deseje sobrepor uma dependência durante os testes. |
||||
|
|
||||
|
Você não quer que a dependência original execute (e nenhuma das subdependências que você possa ter). |
||||
|
|
||||
|
Em vez disso, você deseja fornecer uma dependência diferente que será usada somente durante os testes (possivelmente apenas para alguns testes específicos) e fornecerá um valor que pode ser usado onde o valor da dependência original foi usado. |
||||
|
|
||||
|
### Casos de uso: serviço externo |
||||
|
|
||||
|
Um exemplo pode ser que você possua um provedor de autenticação externo que você precisa chamar. |
||||
|
|
||||
|
Você envia ao serviço um *token* e ele retorna um usuário autenticado. |
||||
|
|
||||
|
Este provedor pode cobrar por requisição, e chamá-lo pode levar mais tempo do que se você tivesse um usuário fixo para os testes. |
||||
|
|
||||
|
Você provavelmente quer testar o provedor externo uma vez, mas não necessariamente chamá-lo em todos os testes que executarem. |
||||
|
|
||||
|
Neste caso, você pode sobrepor (*override*) a dependência que chama o provedor, e utilizar uma dependência customizada que retorna um *mock* do usuário, apenas para os seus testes. |
||||
|
|
||||
|
### Utilize o atributo `app.dependency_overrides` |
||||
|
|
||||
|
Para estes casos, a sua aplicação **FastAPI** possui o atributo `app.dependency_overrides`. Ele é um simples `dict`. |
||||
|
|
||||
|
Para sobrepor a dependência para os testes, você coloca como chave a dependência original (a função), e como valor, a sua sobreposição da dependência (outra função). |
||||
|
|
||||
|
E então o **FastAPI** chamará a sobreposição no lugar da dependência original. |
||||
|
|
||||
|
//// tab | Python 3.10+ |
||||
|
|
||||
|
```Python hl_lines="26-27 30" |
||||
|
{!> ../../../docs_src/dependency_testing/tutorial001_an_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.9+ |
||||
|
|
||||
|
```Python hl_lines="28-29 32" |
||||
|
{!> ../../../docs_src/dependency_testing/tutorial001_an_py39.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.8+ |
||||
|
|
||||
|
```Python hl_lines="29-30 33" |
||||
|
{!> ../../../docs_src/dependency_testing/tutorial001_an.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.10+ non-Annotated |
||||
|
|
||||
|
/// tip | "Dica" |
||||
|
|
||||
|
Prefira utilizar a versão `Annotated` se possível. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="24-25 28" |
||||
|
{!> ../../../docs_src/dependency_testing/tutorial001_py310.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
//// tab | Python 3.8+ non-Annotated |
||||
|
|
||||
|
/// tip | "Dica" |
||||
|
|
||||
|
Prefira utilizar a versão `Annotated` se possível. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
```Python hl_lines="28-29 32" |
||||
|
{!> ../../../docs_src/dependency_testing/tutorial001.py!} |
||||
|
``` |
||||
|
|
||||
|
//// |
||||
|
|
||||
|
/// tip | "Dica" |
||||
|
|
||||
|
Você pode definir uma sobreposição de dependência para uma dependência que é utilizada em qualquer lugar da sua aplicação **FastAPI**. |
||||
|
|
||||
|
A dependência original pode estar sendo utilizada em uma *função de operação de rota*, um *docorador de operação de rota* (quando você não utiliza o valor retornado), uma chamada ao `.include_router()`, etc. |
||||
|
|
||||
|
O FastAPI ainda poderá sobrescrevê-lo. |
||||
|
|
||||
|
/// |
||||
|
|
||||
|
E então você pode redefinir as suas sobreposições (removê-las) definindo o `app.dependency_overrides` como um `dict` vazio: |
||||
|
|
||||
|
```Python |
||||
|
app.dependency_overrides = {} |
||||
|
``` |
||||
|
|
||||
|
/// tip | "Dica" |
||||
|
|
||||
|
Se você quer sobrepor uma dependência apenas para alguns testes, você pode definir a sobreposição no início do testes (dentro da função de teste) e reiniciá-la ao final (no final da função de teste). |
||||
|
|
||||
|
/// |
Loading…
Reference in new issue