- Publicado em
Testes com Jest no ReactJS
- Authors
- Name
- Anderson André
- Github
- @Anderson-Andre-P
Introdução
Os testes desempenham um papel fundamental no desenvolvimento de software, garantindo que o código funcione corretamente e se comporte conforme o esperado. No contexto do ReactJS, o Jest é uma das ferramentas mais populares para escrever testes. Com sua sintaxe intuitiva e poderosas funcionalidades, o Jest simplifica o processo de teste, permitindo que os desenvolvedores criem casos de teste robustos e confiáveis para suas aplicações React. Neste artigo, vamos explorar os conceitos básicos dos testes com Jest no ReactJS e como você pode começar a usá-lo para testar seus componentes.
Instalação e configuração
Antes de começarmos, é necessário instalar o Jest em seu projeto React. Abra o terminal e navegue até o diretório do seu projeto. Em seguida, execute o seguinte comando para instalar o Jest:
npm install --save-dev jest
Após a instalação, o Jest estará pronto para ser usado. Por padrão, o Jest procura arquivos de teste com a extensão .test.js
ou .spec.js
dentro do diretório src. Portanto, certifique-se de seguir essa convenção ao criar seus arquivos de teste.
Escrevendo Testes de Unidade
Os testes de unidade são responsáveis por verificar o comportamento individual de componentes, funções ou classes isoladas. Vamos começar escrevendo um teste simples para um componente React básico. Considere o seguinte componente chamado Button:
// src/components/Button.js
import React from 'react'
const Button = ({ onClick, text }) => <button onClick={onClick}>{text}</button>
export default Button
Agora, vamos criar um arquivo de teste para o componente Button chamado Button.test.js
dentro do diretório src/components
. Adicione o seguinte código ao arquivo:
// src/components/Button.test.js
import React from 'react'
import { render, fireEvent } from '@testing-library/react'
import Button from './Button'
test('renders button with correct text', () => {
const handleClick = jest.fn()
const { getByText } = render(<Button onClick={handleClick} text="Click me" />)
const button = getByText('Click me')
fireEvent.click(button)
expect(handleClick).toHaveBeenCalledTimes(1)
})
Explicação
Neste teste, estamos utilizando as funções render
e fireEvent
fornecidas pelo @testing-library/react
para renderizar o componente Button e interagir com ele. Estamos simulando um clique no botão e verificando se a função handleClick
foi chamada corretamente.
Executando os Testes
Agora que escrevemos nosso primeiro teste, vamos executá-lo. Abra o terminal e execute o seguinte comando na raiz do seu projeto:
npx jest
O Jest executará todos os testes dentro do diretório src
que correspondem aos critérios de nomenclatura mencionados anteriormente. Você deverá ver a saída dos testes no terminal, indicando se eles passaram ou falharam.
Testando Componentes com Estado e Propriedades
Muitos componentes React possuem estado interno e recebem propriedades como entrada. Para testar esses componentes, o Jest oferece várias ferramentas e técnicas úteis. Vamos considerar um exemplo de teste para um componente Counter
que possui um estado interno para controlar o valor do contador:
// src/components/Counter.js
import React, { useState } from 'react'
const Counter = () => {
const [count, setCount] = useState(0)
const increment = () => {
setCount(count + 1)
}
return (
<div>
<p>Count: {count}</p>
<button onClick={increment}>Increment</button>
</div>
)
}
export default Counter
Agora, vamos escrever um teste para verificar se o contador é incrementado corretamente quando o botão é clicado:
// src/components/Counter.test.js
import React from 'react'
import { render, fireEvent } from '@testing-library/react'
import Counter from './Counter'
test('increments counter when button is clicked', () => {
const { getByText } = render(<Counter />)
const incrementButton = getByText('Increment')
fireEvent.click(incrementButton)
const countText = getByText('Count: 1')
expect(countText).toBeInTheDocument()
})
Explicação
Neste teste, utilizamos a função fireEvent.click
para simular um clique no botão de incremento. Em seguida, verificamos se o texto "Count: 1" é renderizado corretamente na tela.
Testando Requisições Assíncronas
No desenvolvimento de aplicações React, é comum realizar chamadas assíncronas a APIs ou serviços externos. O Jest fornece ferramentas para testar essas chamadas assíncronas de maneira fácil e confiável. Considere um componente UserList
que busca uma lista de usuários em uma API:
// src/components/UserList.js
import React, { useState, useEffect } from 'react'
const UserList = () => {
const [users, setUsers] = useState([])
useEffect(() => {
fetch('https://api.example.com/users')
.then((response) => response.json())
.then((data) => setUsers(data))
}, [])
return (
<ul>
{users.map((user) => (
<li key={user.id}>{user.name}</li>
))}
</ul>
)
}
export default UserList
Agora, vamos escrever um teste para verificar se a lista de usuários é renderizada corretamente após a chamada assíncrona:
// src/components/UserList.test.js
import React from 'react'
import { render, waitFor } from '@testing-library/react'
import UserList from './UserList'
test('renders user list after fetching data', async () => {
const { getByText } = render(<UserList />)
await waitFor(() => {
expect(getByText('John')).toBeInTheDocument()
expect(getByText('Jane')).toBeInTheDocument()
expect(getByText('Bob')).toBeInTheDocument()
})
})
Explicação
Neste teste, utilizamos a função waitFor
fornecida pelo @testing-library/react
para aguardar a resolução da chamada assíncrona antes de verificar a presença dos usuários na tela.
Outras Opções de Pacotes de Teste no React
Embora o Jest seja a opção mais popular para testes no ecossistema React, existem outras ferramentas de teste que podem ser úteis, dependendo das necessidades do seu projeto. Vamos explorar brevemente algumas dessas opções:
React Testing Library: Além de fornecer utilitários de renderização e interação de componentes, o React Testing Library (RTL) enfatiza o teste do comportamento do componente com base em como ele é usado pelos usuários. O RTL oferece uma API amigável que permite escrever testes que se assemelham mais à experiência do usuário real.
Enzyme: O Enzyme é uma biblioteca de testes popular que fornece utilitários poderosos para manipular, pesquisar e simular interações em componentes React. Ele oferece uma API intuitiva para testar componentes, incluindo recursos como renderização de shallow e mount, busca de elementos e simulação de eventos.
Cypress: O Cypress é uma ferramenta de teste de ponta a ponta que permite escrever testes para aplicativos React simulando interações reais do usuário. Ele permite que você escreva testes em JavaScript e execute-os em um navegador real, fornecendo recursos avançados, como gravação e reprodução de testes, depuração interativa e observabilidade.
Testing Library for React Native: Se você estiver desenvolvendo aplicativos React Native, a Testing Library for React Native oferece uma abordagem semelhante ao React Testing Library, fornecendo utilitários de renderização e interação específicos para o ambiente React Native.
Cada uma dessas ferramentas tem seus pontos fortes e podem ser usadas em diferentes cenários. É importante explorar e avaliar qual delas se adequa melhor às suas necessidades e preferências de teste.
Conclusão
Neste artigo, exploramos como começar a escrever testes com Jest no ReactJS. Vimos como instalar o Jest em seu projeto, escrever testes de unidade para componentes, como lidar com recursos como estado interno, propriedades e chamadas assíncronas. Além disso, mencionamos outras opções de pacotes de teste, como o React Testing Library, Enzyme, Cypress e Testing Library for React Native. O Jest oferece uma ampla gama de recursos e funcionalidades para testes no ecossistema React, permitindo que você crie testes confiáveis e eficazes para garantir a qualidade do seu código. Comece a usar o Jest em seus projetos React e colha os benefícios de um processo de teste simplificado e mais confiável.