Node.js
Testing con node:test
Pruebas nativas en Node.js con node:test, assertions, mocks, hooks, aislamiento, cobertura y ejecución confiable de tests unitarios e integrados.
- Última actualización
- Actualizada
- Nivel
- Aplicación
Node.js
Pruebas nativas en Node.js con node:test, assertions, mocks, hooks, aislamiento, cobertura y ejecución confiable de tests unitarios e integrados.
import test from "node:test";
import assert from "node:assert/strict";
test("sums prices", () => {
assert.equal(sum([10, 20]), 30);
});import { describe, it, beforeEach } from "node:test";Usa hooks para setup controlado, no para esconder dependencias globales.
test("rejects invalid file", async () => {
await assert.rejects(() => loadFile("missing"), /not found/i);
});Siempre retorna o espera la Promise.
El runner incluye mock.fn, mock.method, restauración automática mediante el contexto del test y mocking de módulos en versiones modernas.
import test from "node:test";
import assert from "node:assert/strict";
test("reports a saved order", (t) => {
const repository = {
save() {},
};
const save = t.mock.method(repository, "save", () => ({ id: "o1" }));
const result = repository.save({ total: 50 });
assert.equal(result.id, "o1");
assert.equal(save.mock.callCount(), 1);
});Prefiere inyectar fronteras claras. Mockear módulos completos puede acoplar el test al loader y exige revisar estabilidad en la versión objetivo.
Los mock timers permiten controlar setTimeout, setInterval y tiempo sin esperar el reloj real:
test("retries after delay", async (t) => {
t.mock.timers.enable({ apis: ["setTimeout", "Date"] });
const pending = retryLater();
t.mock.timers.tick(1_000);
await pending;
});Restaura siempre el reloj. No mezcles timers simulados con I/O real esperando que toda asincronía avance automáticamente.
El runner moderno admite snapshots dependientes de versión. Úsalos para estructuras pequeñas y deliberadas, no para reemplazar assertions semánticas con archivos enormes difíciles de revisar.
Node puede ejecutar tests .ts compatibles con type stripping:
node --test "test/**/*.test.ts"Esto no ejecuta type checking. Conserva:
tsc --noEmit
node --testInicia el servidor real sobre loopback y prueba request, timeout, body límite y abort. Para streams, simula chunks, errores y consumidores lentos.
Ejecuta el binario como child process y comprueba stdout, stderr, exit code y señales.
Tests concurrentes no deben compartir puertos, archivos o estado global. Un test que depende de sleeps fijos suele ser frágil; espera una condición observable.
El test runner puede generar cobertura V8 según la versión y flags disponibles:
node --test --experimental-test-coverageCoverage muestra rutas ejecutadas, no calidad de assertions ni casos ausentes.
Si habilitas module compile cache, la cobertura de funciones restauradas desde bytecode puede ser menos precisa. Desactívala durante la medición cuando necesites resultados exactos:
NODE_DISABLE_COMPILE_CACHE=1 node --test --experimental-test-coverageNo mockees la unidad bajo prueba ni todo el runtime. Tests de integración reales son valiosos para filesystem, HTTP y módulos.
tsc --noEmit.Seguridad en Node.js revisa fronteras de confianza y recursos.