Introducción
Las pruebas unitarias son una parte esencial del desarrollo de software, ya que permiten verificar que las unidades individuales de código (como funciones y componentes) funcionan según lo esperado. Jest es un marco de pruebas de JavaScript desarrollado por Facebook, que se integra perfectamente con React y proporciona una experiencia de pruebas completa y fácil de usar.
Objetivos de esta sección:
- Entender qué es Jest y por qué es útil.
- Configurar Jest en un proyecto de React.
- Escribir y ejecutar pruebas unitarias básicas.
- Explorar características avanzadas de Jest.
¿Qué es Jest?
Jest es un marco de pruebas de JavaScript que se utiliza para realizar pruebas unitarias, de integración y de extremo a extremo. Algunas de sus características clave incluyen:
- Simplicidad: Configuración mínima y fácil de usar.
- Velocidad: Ejecución rápida de pruebas gracias a su capacidad de paralelización.
- Cobertura de código: Genera informes de cobertura de código automáticamente.
- Mocks y espías: Facilita la creación de mocks y espías para pruebas más aisladas.
Configuración de Jest en un Proyecto de React
Paso 1: Crear un Proyecto de React
Si aún no tienes un proyecto de React, puedes crear uno utilizando Create React App:
Paso 2: Instalar Jest
Create React App viene con Jest preconfigurado. Si estás utilizando una configuración personalizada, puedes instalar Jest manualmente:
Paso 3: Configurar Jest
Si necesitas personalizar la configuración de Jest, puedes agregar un archivo jest.config.js en la raíz de tu proyecto:
module.exports = {
setupFilesAfterEnv: ['<rootDir>/src/setupTests.js'],
testEnvironment: 'jsdom',
};Escribiendo Pruebas Unitarias Básicas
Ejemplo 1: Probando una Función Sencilla
Supongamos que tenemos una función sum en un archivo sum.js:
Podemos escribir una prueba unitaria para esta función en un archivo sum.test.js:
// src/sum.test.js
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});Ejemplo 2: Probando un Componente de React
Supongamos que tenemos un componente Button en un archivo Button.js:
// src/Button.js
import React from 'react';
function Button({ label, onClick }) {
return <button onClick={onClick}>{label}</button>;
}
export default Button;Podemos escribir una prueba unitaria para este componente en un archivo Button.test.js:
// src/Button.test.js
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import Button from './Button';
test('renders button with label', () => {
const { getByText } = render(<Button label="Click me" />);
expect(getByText('Click me')).toBeInTheDocument();
});
test('calls onClick when button is clicked', () => {
const handleClick = jest.fn();
const { getByText } = render(<Button label="Click me" onClick={handleClick} />);
fireEvent.click(getByText('Click me'));
expect(handleClick).toHaveBeenCalledTimes(1);
});Características Avanzadas de Jest
Mocks y Espías
Jest facilita la creación de mocks y espías para simular funciones y módulos. Esto es útil para aislar el código que estás probando.
Ejemplo: Mock de una Función
// src/api.js
export const fetchData = () => {
return Promise.resolve({ data: 'some data' });
};
// src/api.test.js
import { fetchData } from './api';
jest.mock('./api');
test('fetchData returns data', async () => {
fetchData.mockResolvedValue({ data: 'mocked data' });
const data = await fetchData();
expect(data).toEqual({ data: 'mocked data' });
});Cobertura de Código
Jest puede generar informes de cobertura de código automáticamente. Para habilitar esto, puedes ejecutar Jest con la opción --coverage:
Esto generará un informe de cobertura en la carpeta coverage.
Ejercicios Prácticos
Ejercicio 1: Prueba de una Función
Crea una función multiply que multiplique dos números y escribe una prueba unitaria para ella.
Solución:
// src/multiply.test.js
const multiply = require('./multiply');
test('multiplies 2 * 3 to equal 6', () => {
expect(multiply(2, 3)).toBe(6);
});Ejercicio 2: Prueba de un Componente
Crea un componente Input que reciba un valor y un manejador de cambio, y escribe una prueba unitaria para verificar que el valor se actualiza correctamente.
Solución:
// src/Input.js
import React from 'react';
function Input({ value, onChange }) {
return <input value={value} onChange={onChange} />;
}
export default Input;// src/Input.test.js
import React from 'react';
import { render, fireEvent } from '@testing-library/react';
import Input from './Input';
test('updates value on change', () => {
const handleChange = jest.fn();
const { getByDisplayValue } = render(<Input value="initial" onChange={handleChange} />);
const input = getByDisplayValue('initial');
fireEvent.change(input, { target: { value: 'updated' } });
expect(handleChange).toHaveBeenCalled();
});Conclusión
En esta sección, hemos aprendido a configurar Jest en un proyecto de React, escribir pruebas unitarias básicas y explorar algunas de las características avanzadas de Jest. Las pruebas unitarias son una herramienta poderosa para garantizar la calidad y la fiabilidad de tu código. En la siguiente sección, profundizaremos en las pruebas de componentes utilizando React Testing Library.
Curso de React
Módulo 1: Introducción a React
- ¿Qué es React?
- Configuración del Entorno de Desarrollo
- Hola Mundo en React
- JSX: Extensión de Sintaxis de JavaScript
Módulo 2: Componentes de React
- Entendiendo los Componentes
- Componentes Funcionales vs de Clase
- Props: Pasando Datos a Componentes
- State: Gestión del Estado del Componente
Módulo 3: Trabajando con Eventos
- Manejo de Eventos en React
- Renderizado Condicional
- Listas y Claves
- Formularios y Componentes Controlados
Módulo 4: Conceptos Avanzados de Componentes
- Elevando el Estado
- Composición vs Herencia
- Métodos del Ciclo de Vida de React
- Hooks: Introducción y Uso Básico
Módulo 5: Hooks de React
Módulo 6: Enrutamiento en React
Módulo 7: Gestión del Estado
- Introducción a la Gestión del Estado
- API de Contexto
- Redux: Introducción y Configuración
- Redux: Acciones y Reductores
- Redux: Conectando a React
Módulo 8: Optimización del Rendimiento
- Técnicas de Optimización del Rendimiento en React
- Memorización con React.memo
- Hooks useMemo y useCallback
- División de Código y Carga Perezosa
Módulo 9: Pruebas en React
- Introducción a las Pruebas
- Pruebas Unitarias con Jest
- Pruebas de Componentes con React Testing Library
- Pruebas de Extremo a Extremo con Cypress
Módulo 10: Temas Avanzados
- Renderizado del Lado del Servidor (SSR) con Next.js
- Generación de Sitios Estáticos (SSG) con Next.js
- TypeScript con React
- React Native: Creación de Aplicaciones Móviles
