Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
GHub
Objetivo
Tecnologias
Instalação [JEST]
Nota do autor
Setup
Instale os seguintes pacotes
Crie o arquivo
jest.config.jsna raiz do projeto, com o seguinte conteúdo dentro:Adicione o comando de execução aos
scriptsdopackage.json:{ "test": "jest", "test:watch": "jest --watch", "test:coverage": "jest --coverage", }Após isso, ao tentar rodar os testes, vai rolar vários erros, erro de transformação de arquivos do ts-jest, erros com path absolute com aliases, etc, etc, porque o jest é bem chato de configurar. Então vamos lá:
jsxdotsconfig.jsonque o next mantém comopreserveao invés dereact, para sobrescrever a regra, crie um arquivo chamadotsconfig.jest.jsone adicione o seguinte trecho de código:{ "extends": "./tsconfig.json", "compilerOptions": { "jsx": "react" } }tsconfigpadrão e sobrescreve a rergajsxque onextobriga serpreservemas para ots-jestfuncionar precisa estar configrada comoreact.Após criar o novo arquivo, você precisa indicar para o
jest, que ots-jestirá usá-lo ao invés do arquivo padrão, para isso, adicione o trecho abaixo nojest.config.jsAgora vamos corrigir o problema com os caminhos absolutos, o jest não entende o a aliases
@/nosimportsdos arquivos, para isso vamos criar uma entrada no objetomoduleNameMapperque irá converter os imports com@/para o caminho real que aponta para o arquivo:Outro problema: imagens. Precisamos transformar as imagens para que o jest entenda e renderize os teste. Para isso vamos adicionar um arquivo chamado
fileTransformer.jsna pastatestdentro da raiz do projeto, esse arquivo deve ter o seguinte código:Depois de criar esse arquivo, registre-o no
jest.config.js:Depois de configurar tudo, ganhei uns vários erros do
Next.js(router, next image, etc, muita coisa fora de ordem) e do React, e pra isso, foi necessário adicionar umas configurações adicionais no arquivojest.setup.tsx:Importar o react de maneira global
Importar o
jest-dompara adicionar métodos de asserção aoexpectImportar e registrar os métodos do next para o jest
Mockar o next router e image component
No final o arquivo deve ficar assim:
Após todo esse setup, consegui finalmente rodar um teste:
Considerações pós setup
Depois de todo o setup acima, eu comecei a escrever os testes de unidade, e como sempre, vários erros, ainda precisava de ajustes caso precisasse implementar os testes da maneira correta.
Um dos cenários que passei, foi testar componentes que usavam o hook
useRouter(), no setup inicial, para os testes rodarem eu havia feito um mock do router, mas aquele mock limitava os testes, e para isso eu resolvi criar um arquivo de configuração para os testes, e com isso eu criei meu próprio render, com alguns detalhes a mais.Esse arquivo que eu criei, possui alguns recursos, ele importa e re-exporta os recursos da RTL, e ele exporta um customRender como comentei.
Vamos ao arquivo (criado em
raiz do projeto>/test/index.tsx)O trecho a seguir, é usado para fazer o registro de todos os providers/contexts que tivermos no projeto, para que os testes e hooks funcionem corretamente (como se fosse a aplicação real rodando). Nesse exemplo eu passei o provider do roteador do Next.js e o provider do React query, para que os hooks
useQuerydentro da app funcionem corretamente.Poderíamos mockar esses contexts/providers, mas nem sempre queremos mockar as coisas, e nesse caso eu quero que a aplicação funcione normalmente como se estivesse sendo usado real.
Sobre o
customRender(), ele é bem simples. Uma função que retorna o render da Testing Library, mas com algumas opções no objeto, o primeiro parâmetro (ui), é o componente que eu quero testar, e depois eu passo um objeto, e preencho a chavewrapperque recebe uma função passando umchildren(nosso componente passado na ui) que será injetado dentro doAllProviderse receberá todos os contextos e recursos necessários para funcionar. E adicionalmente eu recebo as outras options do RTL render para caso eu queira fazer alguma customização dentro do arquivo de teste, eu tenho acesso a interface.O restante do arquivo é somente import e reexport dos recursos.
Vamos ao mock do next router, e aqui não tem nada de mais, é só uma factory simples:
Tempo total dos testes