... | ... | @@ -120,29 +120,46 @@ O projeto utiliza o Jest, um framework de testes completo para JavaScript/TypeSc |
|
|
O Jest atua como o executor e verificador dos testes. Ele oferece um ambiente integrado que combina:
|
|
|
|
|
|
- **Test Runner (Executor de Testes):** **:** O Jest é o programa que ativamente procura por arquivos de teste em nosso projeto (os arquivos `.spec.ts`) e os executa um por um
|
|
|
- **Assertion Library (Biblioteca de Asserção):** permite escrever vO Jest nos dá a ferramenta principal da investigação: a função `expect()`. Com ela, fazemos "asserções" (afirmações) sobre o nosso código. Por exemplo: `expect(soma(2, 2)).toBe(4);` se traduz para: "Eu afirmo que o resultado de `soma(2, 2)` deve ser `4`"
|
|
|
|
|
|
- **Assertion Library (Biblioteca de Asserção):** permite escrever vO Jest nos dá a ferramenta principal da investigação: a função `expect()`. Com ela, fazemos "asserções" (afirmações) sobre o nosso código. Por exemplo: `expect(soma(2, 2))toBe(4);` se traduz para: "Eu afirmo que o resultado de `soma(2, 2)` deve ser `4`"
|
|
|
|
|
|
- **Mocking Library (Biblioteca de Simulação):** Em um caso complexo, o detetive precisa isolar a cena do crime. O Jest nos permite "mocar" (do inglês *mock*, que significa simular ou imitar) as dependências. Se o `AreasService` depende do `AreasRepository` para falar com o banco de dados, podemos dizer ao Jest: "Para este teste, finja que o `AreasRepository` existe e, quando o método `findById` for chamado, retorne este objeto falso aqui". Isso isola o teste apenas para a lógica do `AreasService`
|
|
|
- **Relatórios (Reporting):** exibe no terminal um resumo dos testes, indicando quais passaram (PASS) e quais falharam (FAIL)
|
|
|
|
|
|
### Estrutura e convenções
|
|
|
Os arquivos de teste seguem um padrão para que o Jest os identifique automaticamente:
|
|
|
- `*.spec.ts`: testes unitários de uma funcionalidade específica, como areas.service.spec.ts
|
|
|
- `*.e2e-spec.ts`: testes ponta-a-ponta (End-to-End), que verificam o comportamento da aplicação completa através de requisições HTTP reais.
|
|
|
- **Relatórios (Reporting):** Após a investigação, o Jest apresenta um relatório claro no terminal, dizendo quais afirmações (`expect`) foram confirmadas (`PASS`) e quais foram refutadas (`FAIL`)
|
|
|
|
|
|
### Nomenclatura
|
|
|
A forma como nomeamos nossos arquivos de teste não é aleatória. É uma **convenção**, um acordo que fazemos para que o Jest encontre os testes sem precisarmos configurar nada.
|
|
|
|
|
|
Dissecando o nome do arquivo de teste `areas.service.spec.ts` temos:
|
|
|
- `areas.service`: esta é a **unidade sob teste**. O nome indica claramente que este arquivo de teste é responsável por verificar o comportamento do arquivo `areas.service.ts`
|
|
|
|
|
|
- `.spec`: esta é a parte mais importante. Significa **"Specification" (Especificação)**. Este arquivo não é apenas um "teste", ele é um documento executável que *especifica* como o `areas.service.ts` *deve* se comportar. É o conjunto de regras e requisitos daquela unidade. Outra convenção comum é `.test`, que tem o mesmo significado. Em nosso projeto, adotamos `.spec`
|
|
|
|
|
|
- `.ts`: indica que o arquivo é escrito em **TypeScript**
|
|
|
|
|
|
O sufixo `.spec` vem de Specification, reforçando a ideia de que cada teste documenta o comportamento esperado do código, e não apenas o valida.
|
|
|
- `.e2e`: significa **End-to-End (Ponta-a-Ponta)**. Este sufixo especial nos diz que o escopo do teste é diferente. Ele não vai testar uma unidade isolada, mas sim um fluxo completo da aplicação, geralmente disparado por uma requisição HTTP
|
|
|
|
|
|
### Estrutura de teste
|
|
|
Os testes em **Jest** seguem uma estrutura organizada em blocos e verificações:
|
|
|
|
|
|
### Tipos de teste
|
|
|
- **Testes Unitários**
|
|
|
- **`describe(nome, função)`**
|
|
|
Agrupa testes relacionados em uma **suíte de testes**.
|
|
|
Analogia: é como o **capítulo de um livro**, com todos os testes desse bloco focados em uma funcionalidade específica.
|
|
|
|
|
|
Os testes unitários garantem que partes isoladas do sistema (como services e controllers) funcionem corretamente.
|
|
|
Usando o módulo de testes do NestJS (`@nestjs/testing`), é possível injetar dependências simuladas (mocks) e validar apenas a lógica da unidade sob teste, sem interação real com o banco de dados ou outros módulos.
|
|
|
- **`it(descricao, função)` ou `test(descricao, função)`**
|
|
|
Representa um **caso de teste individual**.
|
|
|
Analogia: é como um **parágrafo dentro do capítulo**, testando uma única coisa. A descrição deve explicar claramente o que está sendo testado.
|
|
|
|
|
|
- **Testes End-to-End (E2E)**
|
|
|
- **`expect(valor)`**
|
|
|
Faz uma **asserção**, verificando se o valor obtido corresponde ao valor esperado.
|
|
|
|
|
|
Os testes E2E verificam o fluxo completo da aplicação, simulando o uso real do sistema.
|
|
|
Para isso, o Jest sobe uma instância da aplicação em memória e utiliza a biblioteca supertest para enviar requisições HTTP (como GET /areas ou POST /producers), validando o código de status e o corpo da resposta.
|
|
|
Esses testes asseguram que todos os componentes do sistema — módulos, rotas e integrações — estejam funcionando em conjunto corretamente.
|
|
|
- **Matchers (`.toBe()`, `.toEqual()`, `.toThrow()`, etc.)**
|
|
|
Métodos que completam a asserção, permitindo comparar valores ou verificar erros.
|
|
|
Exemplos:
|
|
|
```javascript
|
|
|
expect(resultado).toBe(5); // espera que seja exatamente 5
|
|
|
expect(objeto).toEqual({ id: 1 }); // espera que o objeto seja igual em valor
|
|
|
expect(() => func()).toThrow(); // espera que a função lance um erro
|
|
|
|
|
|
### Execução
|
|
|
Os testes são executados com o comando:
|
... | ... | |