PRUEBAS EN JAVASCRIPT CON JEST: GUÍA BÁSICA
Jest es un framework de testing para JavaScript y TypeScript, muy popular en el mundo del desarrollo frontend y backend. Jest lo creó Facebook (Meta). Su función principal es permitir a los desarrolladores escribir, ejecutar y evaluar pruebas automatizadas para garantizar que su código funcione correctamente. Jest es especialmente famoso por ser el framework por defecto cuando se trabaja con React, aunque hoy en día mucha gente está migrando a Vitest.
Ejemplo básico de prueba con Jest
test('suma dos números correctamente', () => {
expect(2 + 2).toBe(4);
});
Jest es muy maduro, enorme ecosistema, mucha documentación y soporte. Pero Vitest es más moderno, mucho más rápido, mejor integración con Vite,el build tool más usado actualmente.
Características principales
| Característica |
Descripción |
| Configuración cero |
Funciona muy bien sin necesidad de mucha configuración inicial |
| Snapshot Testing |
Permite guardar el "resultado esperado" de un componente o función |
| Mocking |
Muy fácil simular módulos, funciones, APIs, etc. |
| Ejecución paralela |
Corre las pruebas de forma rápida y en paralelo |
| Watch Mode |
Modo que vuelve a ejecutar solo las pruebas modificadas |
| Coverage |
Reporte de cobertura de código integrado |
| Compatible con |
React, Vue, Angular, Node.js, TypeScript, etc. |
Instalación básica de Jest
Añadir en el fichero "package.json"
{
"scripts": {
"test": "jest",
"test:watch": "jest --watch"
}
}
Ejemplo básico
Fichero "math.js"
function sumar(a, b) {
return a + b;
}
function restar(a, b) {
return a - b;
}
function esPar(numero) {
return numero % 2 === 0;
}
module.exports = { sumar, restar, esPar };
Fichero "math.test.js"
const { sumar, restar, esPar } = require('./math');
test('debería sumar dos números', () => {
expect(sumar(2, 3)).toBe(5);
expect(sumar(10, -5)).toBe(5);
});
test('debería restar dos números', () => {
expect(restar(10, 4)).toBe(6);
});
test('debería detectar si un número es par', () => {
expect(esPar(4)).toBe(true);
expect(esPar(7)).toBe(false);
});
Usando "describe" e "it"
const { sumar } = require('./math');
describe('Función sumar', () => {
it('debería sumar dos números positivos', () => {
expect(sumar(3, 5)).toBe(8);
});
it('debería sumar números negativos', () => {
expect(sumar(-3, -2)).toBe(-5);
});
it('debería sumar cero', () => {
expect(sumar(5, 0)).toBe(5);
});
});
Matchers más usados en Jest
test('Matchers básicos', () => {
expect(5).toBe(5); // igualdad estricta (===)
expect({ nombre: "Juan" }).toEqual({ nombre: "Juan" }); // comparación profunda
expect([1, 2, 3]).toContain(2); // contiene elemento
expect("Hola mundo").toContain("mundo");
expect(true).toBeTruthy();
expect(false).toBeFalsy();
expect(null).toBeNull();
expect(undefined).toBeUndefined();
expect(() => { throw new Error("Error!") }).toThrow();
expect(10).toBeGreaterThan(5);
expect(10).toBeLessThan(15);
});
Testing de funciones asíncronas
// user.js
async function obtenerUsuario(id) {
const res = await fetch(`https://api.ejemplo.com/users/${id}`);
return res.json();
}
// user.test.js
test('debería obtener un usuario', async () => {
const usuario = await obtenerUsuario(1);
expect(usuario).toHaveProperty('id');
expect(usuario.nombre).toBeDefined();
});
Mock básico (simular función)
const { obtenerUsuario } = require('./user');
test('debería llamar a la API', async () => {
// Crear mock
global.fetch = jest.fn().mockResolvedValue({
json: jest.fn().mockResolvedValue({ id: 1, nombre: "María" })
});
const usuario = await obtenerUsuario(1);
expect(fetch).toHaveBeenCalledWith('https://api.ejemplo.com/users/1');
expect(usuario.nombre).toBe("María");
});