image

Acesse bootcamps ilimitados e +650 cursos

50
%OFF
Article image
Daniel Souza
Daniel Souza08/11/2022 15:24
Compartilhe

React Testing Libraty

  • #HTML
  • #Testes unitários
  • #React

Fala devs, tudo bom?

Estava aqui pensando em tantas coisas que me apaixonei no mundo da tecnologia e uma delas é o RTL (React Testing Libraby). Essa biblioteca de testes fantástica que vem se tornando cada vez mais relevantes em aplicações react. Quando você cria uma aplicação usando o 'create-react-app', ela já vem com os suportes necessários para que possa colocar em prática os testes de sua aplicação, caso crie sua aplicação por outro método basta instalar as dependências do RTL

Instalação:

npm install --save-dev @testing-library/react
  ou
yarn add --dev @testing-library/react

Esse artigo terá como base código próprio com finalidade de exemplificar um caso básico da prática de teste. A página testada será uma página notFound de uma aplicação React onde trabalho com diversas rotas.

Antes de mais nada é importante ressaltar que para o teste entender o uso de rotas faz-se necessário o uso de um método chamado renderWithRouter. Sem mais delongas vamos ao código de fato e ao teste da página notFound.

import React from 'react';
  import './not-found.css';
  

  const NotFound = () => (
   <div className="not-found">
    <h2>
     { `Page requested not found` }
     <span role="img" aria-label="Crying emoji"> 😭</span>
    </h2>
    <img
     className="not-found-image"
     src={ `https://media.giphy.com/media/kNSeTs31XBZ3G/giphy.gif` }
     alt="Pikachu crying because the page requested was not found"
    />
   </div>
  );
  

  export default NotFound;

Acima pode-se ler um desenvolvimento simples aonde se retorna um h2, e 2(duas) imagens para nossa página.

O teste visa justamente checar se tudo que precisamos está sendo renderizado na tela.

import React from 'react';
  import { screen } from '@testing-library/react';
  import renderWithRouter from './renderWithRouter';
  import App from '../App';
  

  describe('Teste o componente <NotFound.js />', () => {
   it(
    'Teste se a página contém um heading h2 com o texto "Page requested not found 😭"',
    () => {
     const { history } = renderWithRouter(<App />);
     history.push('/*');
     const notFoundText = screen.getByRole('heading',
      { name: /Page requested not found/i });
     const emoji = screen.getByRole('img', { name: 'Crying emoji' });
     expect(notFoundText).toBeInTheDocument();
     expect(emoji).toBeInTheDocument();
    },
   );
   it('Teste se a página mostra a imagem', () => {
    const { history } = renderWithRouter(<App />);
    history.push('/*');
    const imageNotFound = screen.getAllByRole('img');
    expect(imageNotFound[1]).toHaveAttribute('src', 'https://media.giphy.com/media/kNSeTs31XBZ3G/giphy.gif');
   });
  });

Explicando um pouco o código do teste, parece complexo, mas na verdade é bem simples, vamos começar com o básico das sintaxes.

Describe: Vai ser usado para organizar seus blocos de testes, geralmente usamos para separar por finalidades ou componentes que desejamos testar. ao chamar o describe passamos uma string para essa espécie de título e chamamos uma callback que recebera os testes em si.

test ou it: É o que vamos usar para de fato criar o teste, novamente vamos passar uma string passando de preferência mais detalhes sobre o que está sendo testado e uma callback que receberá o código de teste.

it('Teste se a página mostra a imagem', () => {
    const { history } = renderWithRouter(<App />);
    history.push('/*');
    const imageNotFound = screen.getAllByRole('img');
    expect(imageNotFound[1]).toHaveAttribute('src', 'https://media.giphy.com/media/kNSeTs31XBZ3G/giphy.gif');
   });
  });

Pegando um fragmento do teste acima vamos nos atentar em como de fato desenvolvemos esse teste. O primeiro passo e falar o que eu quero testar, é literalmente como se fosse falado "pega para mim este elemento da tela", na linguagem do código podemos traduzir com o screen.getAllByRole, uma das muitas querys que o RTL possui, se apegue a documentação para achar a que melhor se encaixa ao momento que o seu teste se encontra. No nosso caso o que acontece é basicamente "pegue todas as imagens presentes na tela" e assim o teste entende e na constante imageNotFound se cria um array com todas as imagens, se atente a isso. Okay, tenho o elemento que quero testar, mas e agora? Basta simplesmente falar para o teste "eu espero que essa imagem tenha esse atributo" já que nesse caso estamos procurando por uma url de imagem, novamente se atenha a documentação para saber qual expect usar, na linguagem do código isso é representado com:

expect(imageNotFound[1]).toHaveAttribute('src', 'https://media.giphy.com/media/kNSeTs31XBZ3G/giphy.gif');

Aqui vai uma observação, se atente que no expect foi chamada a constante e o index do elemento que eu quero testar, afinal o getAllByRole cria um array de todos os elementos que tenha o mesmo role, então nosso código tem que ser bem detalhadinho para não haver erros ou até mesmo os temidos falsos positivos.

RTL é muito mais extenso e muito mais fascinante do que eu poderia me estender aqui, deixo como indicação final a leitura da documentação e espero que ao menos instigue ao estudo dessa área tão importante para aqueles que ainda não conhecem e aqueles que conhecem que possam se aprofundar com essa ferramenta extremamente poderosa.

Compartilhe
Comentários (2)
Daniel Souza
Daniel Souza - 09/11/2022 16:24

William, valeu o feedback, eu fiz curso na trybe, uma instituição que tem dado um suporte muito bom, outra fonte de estudos além aqui da dio é a udemy tb além das próprias documentações.

William Angelis
William Angelis - 09/11/2022 16:01

Bem daora, estou estudando sobre testes no react também, por onde você tem estudado?