DevPath · Aprende a programar ESPTEN

Routing, testing y patrones

Testing de componentes con React Testing Library

Probar como el usuario

React Testing Library (RTL) es la herramienta de referencia para probar componentes. Su filosofía es explícita:

Cuanto más se parezcan tus pruebas a la forma en que se usa tu software, más confianza te darán.

Por eso RTL te empuja a interactuar con el componente como lo haría una persona (buscando textos, etiquetas y roles) y no a inspeccionar detalles internos como el estado o los nombres de los métodos.

Esta lección es conceptual: el runtime de los ejercicios no incluye RTL. Aquí aprendes la filosofía y la API; el repaso se hace con cuestionarios.

El flujo básico: render, screen, eventos

import { render, screen } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import Contador from "./Contador";

test("incrementa al pulsar el botón", async () => {
  render(<Contador />);

  // Buscar como el usuario: por lo que se ve.
  expect(screen.getByText("Cuenta: 0")).toBeInTheDocument();

  // Interactuar como el usuario: pulsar el botón.
  await userEvent.click(screen.getByRole("button", { name: "Sumar" }));

  expect(screen.getByText("Cuenta: 1")).toBeInTheDocument();
});

Comportamiento, no implementación

La idea de fondo: si renombras una variable de estado o cambias useState por useReducer, la prueba no debería romperse mientras la interfaz se comporte igual. Estás probando comportamiento observable, no detalles de implementación. Esto hace que las pruebas sobrevivan a los refactorizados.

¿Quién ejecuta las pruebas?

RTL solo ofrece las utilidades para renderizar y consultar; necesita un ejecutor de tests (test runner) que las corra. Los dos más habituales son Vitest (rápido, integrado con Vite) y Jest (el clásico). Ambos aportan test/it, expect y los matchers como toBe o toEqual.

Pon esto en práctica

DevPath es un curso práctico: aquí lees la teoría; en la app la pones en práctica con ejercicios que se ejecutan de verdad, sin conexión.

Empezar gratis en la app →
← Routing con React Router (conceptual)Error boundaries y patrones avanzados →