Lecciones del curso

Testing en React con Jest y testing-library

Instalando Jest en nuestro proyecto
20m
Básicos de Jest
Matchers segunda parte
Números
Arrays
Async
Mocks primera parte
Mocks segunda parte
Mocks tercera parte
Testing sexta parte
Testing séptima parte
Matchers primera parte
Testing en Create React app
Explorando react-testing-library
Explorando testing-library/jest-dom
Detonando eventos con testing-library
Testing con snapshots
11m
Explorando el proyecto
Testeando nuestro primer componente con redux parte 1
Testeando nuestro primer componente con redux parte 2
Testing de actions creators y thunks (acciones asíncronas)
Testing reducers
Mock Avanzado: Peticiones http con msw.js
21m
Mock axios
Router primera parte
Router segunda parte
Router tercera parte
Router cuarta parte

¿Qué es testing-Library/jest-dom?

La librería @testing-library/jest-dom proporciona un conjunto de matchers personalizados que puedes usar en conjunto con los ya existentes en jest, los matchers de @testing-library/jest-dom permiten crear test mas declarativos, claros, faciles de leer y mantener.

Instalación

$ npm install --save-dev @testing-library/jest-dom

o si prefieres usar yarn

$ yarn add --dev @testing-library/jest-dom

Uso

En nuestro caso gracias a que estamos usando CRA, esta librería ya esta configurada en el archivo setupTests.js

Una vez instalado el paquete, si no estás usando CRA, puedes configurarlo de la siguiente manera:

// En tu archivo jest-setup.js (o cualquier otro nombre) import "@testing-library/jest-dom"; // En el archivo jest.config.js agrega setupFilesAfterEnv: ["<rootDir>/jest-setup.js"];

Primer test

Componente a testear

Para nuestras pruebas crearemos un archivo Basic.js donde crearemos un componente muy simple que va a mostrar la información que le pasemos por medio del prop data, el código del componente es:

import React from "react"; const Basic = ({ title, data }) => { return ( <> <h1>{title}</h1> {data ? ( <ul> {data.map((item, i) => ( <li key={i}>{item}</li> ))} </ul> ) : ( <p>No hay información para mostrar</p> )} </> ); }; export default Basic;

Una vez listo el componente, crearemos la prueba dentro del archivo Basic.test.js, nuestra prueba consiste en comprobar que el componente muestre la información y se dibuje de forma correcta en el navegador, para esto montaremos el componente usando el método render, mandaremos los props necesarios title y data con los siguientes valores:

render(<Basic title="Lista" data={["test 1", "test 2"]} />);

Queries

Con el componente montado en nuestro dom virtual, el siguiente paso es obtener los nodos correspondientes al title y los elementos de la lista, usaremos los queries de getByRole y getAllByRole. La librería nos dice que ByRole debería ser nuestra primer opción para buscar elementos en el árbol de nodos. Podemos encontrar más información al respecto aquí.

Para hacer la busqueda vamos a aprovechar los roles que tiene cada elemento, por ejemplo, las etiquetas <h1 /> tiene el role heading y las etiquetas <li/> tiene el role de listitem, podemos encontrar una referencia de los roles existentes aquí

Hecho esto nuestros queries quedan de la siguiente forma:

const header = screen.getByRole("heading", { name: "Lista" }); const listItems = screen.getAllByRole("listitem");

Si por alguna razón nuestros quaries no encuentran ningún elemento podremos ver al correr nuestras pruebas que en la terminal se nos van a mostrar, si es que existen, los roles disponibles en el árbol de nodos.

Assertions

Para finalizar haremos nuestras comprobaciones. Aquí es donde jest-dom entra en juego, uno de los assertions que jest-dom nos expone es toBeInTheDocument y nos va a permitir asegurar que el elemento se encuentra en el dom.

expect(listItems.length).toBe(2); expect(header).toBeInTheDocument();

Al final nuestra prueba se ve así:

describe("Basic", () => { it("should render", () => { render(<Basic title="Lista" data={["test 1", "test 2"]} />); const header = screen.getByRole("heading", { name: "Lista" }); const listItems = screen.getAllByRole("listitem"); expect(listItems.length).toBe(2); expect(header).toBeInTheDocument(); }); });

Pueden encontrar el repo en github aquí

spaceman

¿List@ para ver todo el curso? Prepárate porque apenas estamos comenzando 🚀

¡Desbloquea el curso completo y conviértete en un PRO del desarrollo web! 🫶🏻 .