Test Runner

Jest

Jest es el ejecutor de pruebas clásico de JavaScript: con todo incluido, capacidad de snapshots y sigue siendo el estándar en innumerables bases de código de Node y React.

intermediate13 min readUpdated 15 sept 2026
sum.test.js
js
// sum.test.js
import { sum } from "./sum";

describe("sum", () => {
  test("adds two numbers", () => {
    expect(sum(2, 3)).toBe(5);
  });

  test("handles negatives", () => {
    expect(sum(-1, -1)).toBe(-2);
  });
});
Mantenido por
Meta
API
describe, test, expect
Mocks
jest.fn, jest.mock
Snapshots
Integrados
Cobertura
Integrada
Transforms
Babel, ts-jest, SWC

Por que importa

Por qué Jest sigue siendo relevante

Todo incluido

Las aserciones, el mocking, los snapshots y la cobertura vienen juntos, por lo que un proyecto nuevo requiere muy poca configuración.

Snapshots

Captura la salida una vez y detecta cambios no deseados, útil para estructuras serializables grandes.

Ecosistema maduro

Años de plugins, presets e integraciones significan que casi cualquier stack tiene una configuración de Jest documentada.

La imagen completa

Las tres ideas detrás de Jest

Un ejecutor sin configuración, una API de aserciones familiar y mocking, snapshots y cobertura integrados.

El ejecutor

Ejecutar

Descubre archivos de prueba, los ejecuta en entornos aislados y reporta los resultados.

Aserciones y mocks

Verificar

expect con matchers, además de jest.fn, jest.spyOn y jest.mock para el aislamiento.

Pipeline de transformación

Construir

Babel, ts-jest o SWC compilan la sintaxis moderna y JSX antes de que se ejecuten las pruebas.

Jest de un vistazo

El núcleo de Jest

describe y test

Agrupa suites y declara casos individuales según el comportamiento.

Matchers

toBe, toEqual, toMatchObject, toThrow y muchos más.

Mocks y spies

jest.fn, jest.spyOn y jest.mock aíslan la unidad bajo prueba.

Fake timers

Controla setTimeout y Date para pruebas de tiempo deterministas.

Snapshots

Almacena un resultado serializado y compáralo en ejecuciones posteriores.

Cobertura

Reportes de cobertura integrados con umbrales configurables.

Una breve historia

El ejecutor que definió a una generación

  1. 2014

    Lanzamiento de Jest

    Facebook introduce un ejecutor de pruebas diseñado para proyectos de React y JavaScript.

    14
  2. 2016

    Jest 15 y 16

    Una reescritura reduce la fricción de configuración y las pruebas de snapshot se vuelven populares.

    16
  3. 2018

    Jest 23 y más allá

    Jest se convierte en el ejecutor de pruebas de JavaScript más utilizado.

    18
  4. 2021

    Auge de Vite y Vitest

    Vitest ofrece una alternativa más rápida y nativa de Vite con una API compatible.

    21
  5. Hoy

    Sigue estando en todas partes

    Dominante en bases de código existentes de Node, React y React Native, y totalmente mantenido.

    Hoy

La guia completa

Jest: Todo lo que necesitas saber

¿Qué es Jest?

Jest es un test runner de JavaScript creado en Facebook y actualmente una de las herramientas de testing más utilizadas en el ecosistema. Es una solución batteries-included: las aserciones, el mocking, el snapshot testing y la cobertura vienen incluidos en un solo paquete, por lo que un proyecto nuevo requiere muy poca configuración para comenzar.

Durante años, Jest fue la opción predeterminada para proyectos de React y Node.js, y sigue siendo dominante en las bases de código existentes. Incluso con el ascenso de Vitest, la API de Jest es el vocabulario compartido del testing en JavaScript, lo que hace que valga la pena conocerlo independientemente del runner que utilices en tu día a día.

Escribiendo tests

Un archivo de test de Jest utiliza describe para agrupar y test (o it) para declarar un caso.

// cart.test.js
import { Cart } from "./cart";

describe("Cart", () => {
  test("starts empty", () => {
    expect(new Cart().items).toEqual([]);
  });

  test("adds an item", () => {
    const cart = new Cart();
    cart.add({ id: 1, price: 10 });
    expect(cart.items).toHaveLength(1);
  });
});

Usa beforeEach y afterEach para el setup y teardown, y beforeAll y afterAll cuando un recurso deba crearse una sola vez para todo el archivo. Nombra los tests basándote en el comportamiento, para que un fallo te indique exactamente qué se rompió.

Matchers

La API de expect de Jest es amplia y expresiva.

// matchers.test.js
expect(value).toBe(5);                 // strict equality
expect(value).toEqual({ a: 1 });       // deep equality
expect(value).toBeDefined();
expect(list).toContain("a");
expect(fn).toThrow("invalid");
expect(value).toBeGreaterThan(3);
expect(obj).toMatchObject({ id: 1 });  // partial match

toBe compara con Object.is y es la opción adecuada para primitivos. toEqual compara objetos y arrays de forma recursiva. toStrictEqual es más estricto con los tipos y las propiedades undefined. toMatchObject es útil cuando solo te interesa un subconjunto de una estructura.

Mocks, spies y mocking de módulos

El sistema de mocking de Jest es una de sus características más potentes.

// users.test.js
import { jest } from "@jest/globals";
import { getUser } from "./users";

jest.mock("./http", () => ({
  get: jest.fn().mockResolvedValue({ id: 1, name: "Ada" }),
}));

test("returns a user", async () => {
  await expect(getUser(1)).resolves.toEqual({ id: 1, name: "Ada" });
});

jest.fn crea una función mock, jest.spyOn envuelve un método real para que puedas observar las llamadas y restaurarlo más tarde, y jest.mock reemplaza un módulo. Debido a que jest.mock se eleva (hoisting) por encima de los imports, el mock ya está configurado antes de que se cargue el módulo bajo prueba.

Limpia siempre los mocks entre tests. Activa clearMocks, resetMocks o restoreMocks en la configuración, o llama al helper ...AllMocks correspondiente en afterEach. El estado residual de los mocks es una de las razones más comunes por las que los tests pasan individualmente pero fallan cuando se ejecutan juntos.

Pruebas asíncronas

Usa async/await con resolves y rejects, exactamente igual que lo harías en Vitest.

// async.test.js
test("rejects on failure", async () => {
  await expect(loadUser(-1)).rejects.toThrow("Invalid id");
});

El callback done funciona, pero es fácil usarlo incorrectamente. Es preferible usar await. Para los temporizadores, jest.useFakeTimers() junto con jest.advanceTimersByTime() hace que las pruebas de debounce y reintentos sean deterministas.

Snapshots

Los snapshots serializan un valor y lo comparan en ejecuciones futuras.

// config.test.js
test("builds the default config", () => {
  expect(createConfig({ debug: true })).toMatchInlineSnapshot();
});

Los inline snapshots residen en el archivo de prueba, lo que permite revisarlos en un diff. Los snapshots externos son convenientes para salidas de datos extensas, pero frecuentemente se actualizan sin inspección, lo que los convierte en un simple trámite. Utiliza snapshots para datos serializables estables, no como un sustituto de analizar qué es lo que realmente importa.

Configuración

Jest lee la configuración desde jest.config.js, una clave jest en package.json o un flag de la CLI.

// jest.config.js
export default {
  testEnvironment: "jsdom",
  clearMocks: true,
  collectCoverage: true,
  coverageThreshold: {
    global: { lines: 80, functions: 80 },
  },
  transform: {
    "^.+\\.(t|j)sx?$": ["@swc/jest"],
  },
};

testEnvironment selecciona node o jsdom. clearMocks evita fugas de memoria (leakage). Los umbrales de cobertura (coverage thresholds) convierten un objetivo en una regla obligatoria. El transform decide cómo se compilan TypeScript y JSX, siendo ts-jest, Babel y SWC las opciones más comunes.

Dónde encaja Jest

Jest es la capa de pruebas unitarias y de integración. Para el comportamiento de los componentes, combínalo con Testing Library para realizar pruebas desde la perspectiva del usuario. Para flujos de usuario completos, utiliza una herramienta end-to-end como Playwright o Cypress. Si estás iniciando un nuevo proyecto con Vite, Vitest ofrece la misma API con un pipeline compartido más rápido.

Mejores prácticas

  • Prueba el comportamiento a través de APIs públicas, no de implementaciones internas privadas.
  • Mantén una sola aserción lógica por prueba siempre que sea práctico.
  • Reinicia y restaura los mocks entre pruebas.
  • Prefiere async/await sobre done.
  • Usa fake timers para cualquier funcionalidad que dependa del tiempo.
  • Crea snapshots de estructuras pequeñas y estables, y revisa cada actualización.
  • Ejecuta las pruebas en CI con cada cambio, no solo de forma local.

Errores comunes

  • Hacer aserciones sobre detalles de implementación, lo que provoca que los tests fallen durante los refactors.
  • Actualizar snapshots a ciegas.
  • Olvidar limpiar los mocks, provocando fugas de estado entre tests.
  • Usar timers reales, haciendo que los tests sean lentos o inestables (flaky).
  • Probar todo a nivel unitario y pasar por alto errores de integración.
  • Ignorar la cobertura asumiendo que los tests cubren los flujos más importantes.

Próximos pasos

Jest es una base confiable y un vocabulario compartido en todo el ecosistema. Compáralo con Vitest para proyectos modernos de Vite, añade Testing Library para los componentes y cubre los flujos de usuario con Playwright o Cypress. Después, escribe una prueba para un bug que hayas corregido recientemente y deja que te proteja contra regresiones.

Pruebas de código asíncrono

Usa await con la promesa y haz la aserción sobre el resultado. El callback done es fácil de olvidar y causa timeouts confusos.

Preferir
test("loads the user", async () => {
  await expect(getUser(1)).resolves.toEqual({
    id: 1,
    name: "Ada",
  });
});
Evitar
test("loads the user", (done) => {
  getUser(1).then((user) => {
    expect(user.name).toBe("Ada");
    done();
  });
});

Alcance de los snapshots

Haz snapshots de estructuras pequeñas y estables. Un snapshot enorme que todo el mundo actualiza a ciegas es peor que no tener ninguna prueba.

Preferir
expect(parseConfig(input)).toMatchInlineSnapshot(`
  {
    "debug": true,
    "level": "info",
  }
`);
Evitar
expect(renderWholeApp()).toMatchSnapshot();
// huge, unstable and always
// updated without review

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender Jest?

Nuestro tutorial interactivo te guia a traves de Jest paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.