Vitest
Vitest proporciona ejecuciones rápidas de pruebas de TypeScript, modo de observación, mocking y cobertura para backends de Node que superan las capacidades de node:test puro.
Receta
Tarjeta de receta de referencia rápida: lista para copiar y pegar.
npm install -D vitest @vitest/coverage-v8// vitest.config.ts
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
environment: "node",
include: ["test/**/*.test.ts", "src/**/*.test.ts"],
coverage: { provider: "v8", reporter: ["text", "lcov"] },
},
});{ "scripts": { "test": "vitest run", "test:watch": "vitest" } }Cuándo usarlo:
- Uso intensivo de
vi.mock()para APIs externas y bases de datos. - Modo de observación durante TDD en servicios TypeScript.
- Umbrales de cobertura en CI.
Ejemplo de funcionamiento
// src/users/client.ts
export async function fetchUser(id: string): Promise<{ id: string; name: string }> {
const res = await fetch(`https://api.example.com/users/${id}`);
if (!res.ok) throw new Error("upstream error");
return res.json() as Promise<{ id: string; name: string }>;
}// test/users/client.test.ts
import { afterEach, describe, expect, it, vi } from "vitest";
import { fetchUser } from "../../src/users/client.js";
afterEach(() => vi.restoreAllMocks());
describe("fetchUser", () => {
it("returns user json", async () => {
vi.stubGlobal(
"fetch",
vi.fn().mockResolvedValue({
ok: true,
json: async () => ({ id: "1", name: "Ada" }),
}),
);
await expect(fetchUser("1")).resolves.toEqual({ id: "1", name: "Ada" });
});
});# CI
- run: npm run test -- --coverageLo que esto demuestra:
vi.stubGlobalreemplazafetchsin refactorización de inyección de dependencias.vitest rununa sola pasada para CI;vitesten modo de observación localmente.- La cobertura V8 se integra con Codecov/Sonar.
Análisis profundo
Cómo funciona
- Vitest utiliza el pipeline de transformación de Vite para una transpilación rápida de TS (esbuild/swc).
- Compatible con la API tipo Jest (
describe,it,expect,vi). environment: "node"evita jsdom a menos que se pruebe el DOM.- Los hilos del pool ejecutan archivos de prueba en paralelo.
Consejos de configuración
| Opción | Propósito |
|---|---|
setupFiles | Configuración global de pruebas (variables de entorno) |
testTimeout | Aumentar para pruebas de integración |
pool: "forks" | Aislar fallos de complementos nativos |
Notas de TypeScript
vitest/configtipificadefineConfig.- Los alias de ruta de
tsconfigse pueden conectar a través del pluginvite-tsconfig-pathssi es necesario.
Errores comunes
- Mezclar Vitest y node:test - Dos ejecutores confunden a los colaboradores. Solución: elige uno por repositorio o por paquete en un monorepo.
- Mocking de módulos ESM - Problemas de hoisting con
vi.mock. Solución: usa la fábricavi.mocke importaciones dinámicas después del mock. - Pruebas de integración en el pool predeterminado - Condiciones de carrera de la base de datos. Solución: separa
vitest.integration.config.tsconfileParallelism: false. - Cobertura en código solo de rama - Falsa confianza. Solución: combina la cobertura con pruebas de mutación o aserciones de comportamiento con moderación.
- Cambio de instantáneas - Ruido en PR grandes. Solución: prefiere
toEqualexplícito en campos estables.
Alternativas
| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| node:test | Cero dependencias, pruebas unitarias simples | Necesidades de mocking intensivo |
| Jest | Suites existentes de brownfield | Greenfield que prefiere la velocidad |
| tap | Consumidores de TAP | El equipo quiere la experiencia de desarrollador de Vitest |
Preguntas frecuentes
¿Vitest es solo para frontends de Vite?
No. environment: "node" apunta a APIs de backend y workers.
¿Cómo hago un mock de un módulo?
vi.mock("../src/db.js", () => ({ query: vi.fn() }));¿Puede Vitest probar aplicaciones Express?
Sí, con Supertest o app.inject para Fastify. Exporta createApp() sin escuchar.
¿Cómo establezco los umbrales de cobertura?
coverage: { thresholds: { lines: 80, functions: 80 } }¿Funciona en monorepos?
vitest.config.ts por paquete o configuración raíz con un array de projects.
¿Cómo pruebo servicios NestJS?
Usa @nestjs/testing Test.createTestingModule dentro de los bloques describe de Vitest.
¿Modo de observación en Docker?
Mala experiencia de desarrollador; usa el modo de observación localmente, vitest run en contenedores.
¿ESM o CJS?
Prefiere proyectos "type": "module"; Vitest maneja ESM de forma nativa en Node 24.
¿Cómo depuro una prueba?
vitest --inspect-brk o la extensión de Vitest para VS Code.
¿Paralelo vs. serial?
describe.sequential o configuración separada para suites de integración de bases de datos.
Relacionado
- node:test y node:assert - alternativa sin dependencias
- Supertest e integración HTTP - pruebas HTTP
- Mejores prácticas de prueba - comportamiento sobre implementación
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.