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

npm install -D 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");
});