Jest 22: Mejoras y Runners Personalizados
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Hoy anunciamos una nueva versión mayor de Jest que refina casi todas sus partes para proporcionar una base de pruebas más sólida. Junto con la comunidad de Jest, realizamos numerosos cambios integrales que te ayudarán a sacar más provecho del framework. También promovemos la función de runners personalizados fuera de su fase experimental y añadimos un nuevo paquete, jest-worker, para paralelizar trabajo entre múltiples procesos. Compilamos una lista de aspectos destacados a continuación, pero asegúrate de revisar el (como siempre) extenso registro de cambios.
Adiós Node 4 & bienvenido JSDOM 11
Con esta versión eliminamos el soporte para Node 4, principalmente porque JSDOM (una de nuestras principales dependencias) terminó su soporte. Jest ahora incluye JSDOM 11 por defecto, que ofrece mejor soporte para SVGs, requestAnimationFrame, URL y URLSearchParams integrados, y mucho más.
Runners Personalizados + Paralelización fácil con jest-worker
En Jest 21 introdujimos el concepto de runners personalizados. Desde entonces, Rogelio (uno de los colaboradores principales de Jest) creó varios runners útiles: Si tienes muchas pruebas existentes escritas en otro framework pero quieres beneficiarte inmediatamente de las características de Jest, revisa jest-runner-mocha. Si tienes una base de código grande que requiere linting, puedes obtener aceleraciones significativas ejecutando eslint dentro de Jest usando jest-runner-eslint.
Para obtener control más granular sobre la paralelización de tareas pesadas (ej. transformar archivos o explorar sistemas de archivos), diseñamos una nueva librería perfectamente adaptada al trabajo. Desarrollamos un módulo moderno basado en Promesas con API accesible, llamado jest-worker, que permite delegar funciones intensivas en procesos hijos. Como jest-worker (como cualquier paquete de Jest) es parte de la plataforma Jest, puedes usarlo libremente incluso sin utilizar Jest propiamente. Encontrarás más en la documentación aquí.
Para comprender mejor los runners personalizados y Jest como plataforma, asegúrate de ver la charla de Rogelio en Reactive Conf 2017: Jest como Plataforma.
Codeframe en fallos de pruebas
Para identificar más fácilmente qué aserción falla en tus pruebas, añadimos un marco de código que muestra el contexto de la aserción, permitiéndote enfocarte en tu propio código. Observa el siguiente ejemplo de prueba:
test('some test', () => {
function someFunctionWhichShouldThrow() {
if (false) {
throw new Error();
}
return 'success!';
}
expect(someFunctionWhichShouldThrow).toThrow();
});
En Jest 21, mostraríamos este error:

En Jest 22 añadimos un codeframe que brinda más contexto a las aserciones fallidas. También limpiamos el stack trace eliminando más ruido que nunca.

Pruebas más sencillas de errores en código asíncrono
Ahora puedes usar toThrow y toThrowErrorMatchingSnapshot en rechazos de promesas, igual que en errores síncronos.
async function throwingFunction() {
throw new Error('This failed');
}
test('asynchronous rejection', async () => {
await expect(throwingFunction()).rejects.toThrowErrorMatchingSnapshot();
});
Entornos de prueba asíncronos
Cuando el equipo de Google Chrome anunció Puppeteer en agosto, una herramienta para interactuar programáticamente con un navegador Chromium real, muchos quisieron usar Jest para escribir pruebas ejecutándose en Chrome. La comunidad nos ayudó a hacer esto posible permitiendo entornos de prueba asíncronos. Todavía estamos trabajando para mejorar esta experiencia, pero puedes consultar esta guía para usar Puppeteer con Jest desde hoy.
Detección Experimental de Fugas
Agregamos una configuración experimental --detectLeaks a Jest que te alertará si se produce una fuga de la instancia interna del entorno después de ejecutar una prueba. También advertirá cuando tu suite de pruebas intente requerir un archivo después de finalizada la prueba, indicando que olvidaste esperar operaciones asíncronas o dejaste algo sin limpiar adecuadamente. Esto no detectará fugas en código de aplicación, solo en código de pruebas; aunque la tecnología subyacente (jest-leak-detector) podría ayudarte. Si reportas un error sobre uso de memoria en Jest, proporciona un caso reproducible donde --detectLeaks haga fallar el test. Comenzamos a construir un mejor mecanismo de aislamiento para Jest pero aún no está listo para activarse por defecto. ¡Si quieres ayudar, contáctanos en Discord!
Mejoras en Modo Watch
Al usar el modo watch, ahora puedes enfocarte solo en pruebas que fallaron previamente. En este modo, Jest no re-ejecutará pruebas que pasaron anteriormente, ayudándote a resolver fallos. Adicionalmente, agregamos un sistema de plugins al modo watch. Añadiendo módulos a watchPlugins en tu configuración, puedes extender sus funcionalidades.
Soporte para Babel 7
Jest usa Babel internamente para cobertura de código y funciones avanzadas de mocking. Con Jest 22, también soporta el próximo Babel 7. Encuentra más detalles aquí.
Mejoras en Funciones Mock
Las funciones mock en Jest 22 tienen varias mejoras. Primero, agregamos una propiedad mockName para nombrar tus mocks, útil en fallos de aserciones. También hicimos serializable la función mock de Jest en pretty-format, permitiendo snapshot testing de mocks. En Jest 21, expect(jest.fn()).toMatchSnapshot() se serializaba como [Function]; en Jest 22 podrías obtener algo como:
test('my mocking test', () => {
const mock = jest.fn().mockName('myMock');
mock('hello', {foo: 'bar'});
expect(mock).toMatchSnapshot();
});
// Serializes to:
exports[`my mocking test 1`] = `
[MockFunction myMock] {
"calls": Array [
Array [
"hello",
Object {
"foo": "bar",
},
],
],
}
`;
Lo Destacado de Jest 21
Jest 21 se lanzó en septiembre y lamentablemente no escribimos un blog post. Aquí un resumen rápido de sus principales cambios:
-
Usa expect y jest-mock en el navegador: Michael Jackson donó su excelente paquete
expecta Jest. Con ayuda de Kenneth Skovhus, adaptamosjest-matchers(renombrado aexpect) yjest-mockpara navegadores. Esto significa que aunque no puedes usar Jest completo en navegadores (aún), sí puedes usar sus aserciones y mocks como reemplazo de Chai y Sinon en pruebas Mocha. Para migrar desdeexpectanterior al nuevoexpectpotenciado por Jest, usajest-codemods. -
Licencia MIT: Cambiamos la licencia de Jest a MIT. ¡Hurra!
-
Fallar suites de prueba en errores asíncronos: Jest solía tener un error que hacía que se bloqueara cuando se lanzaban excepciones en ciertas partes de código asíncrono. Esto fue solucionado por colaboradores de la comunidad.
-
Inicio más rápido: Con Jest 21 afinamos el inicio de Jest para que sea más del 50% más rápido. La gran sobrecarga de Jest al ejecutarlo en pruebas pequeñas y rápidas siempre fue un problema para nosotros, y ahora esto ya no debería ser un motivo para evitar usar Jest.
Comunidad de Jest
La comunidad alrededor de Jest está trabajando intensamente para mejorar aún más la experiencia de testing. Estos son proyectos independientes del núcleo de Jest, pero queremos destacar algunos de nuestros favoritos personales.
-
jest-image-snapshot – comparador personalizado para imágenes con snapshots, creado por desarrolladores de American Express
-
ts-jest – todo lo necesario para ejecutar Jest exitosamente en proyectos TypeScript, por @kulshekhar
-
jest-codemods – migra fácilmente tus tests desde otros frameworks a Jest
-
jest-plugins – nuevo proyecto comunitario orientado a simplificar la configuración de entornos de testing para herramientas específicas como React, además de proporcionar utilidades prácticas
También nos complace anunciar que recientemente lanzamos un nuevo espacio para extensiones de Jest de alta calidad: jest-community. Es una organización de GitHub que ya incluye nuestros proyectos favoritos, como vscode-jest y jest-extended, curados por mantenedores y colaboradores de Jest. Incluso migramos nuestro eslint-plugin-jest allí, donde ya vemos grandes contribuciones que se publican independientemente a mayor velocidad.

Agrupar proyectos comunitarios bajo una misma organización también nos permite experimentar con funciones como publicaciones automatizadas, que nos gustaría implementar en Jest. Además, facilita compartir elementos comunes entre proyectos, como la estructura del README (gracias a la comunidad de webpack por la idea), haciendo todo más fácil de aprender y usar.
Si tienes algo increíble para compartir, ¡contáctanos! Nos encantaría destacar tu proyecto aquí.
