Publicado em

Testes com Jest no ReactJS

Authors

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:

  1. 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.

  2. 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.

  3. 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.

  4. 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.