Jest 27: Nuevos valores predeterminados para Jest, edición 2021 ⏩
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
En la publicación de Jest 26 hace aproximadamente un año, anunciamos que después de dos lanzamientos principales con pocos cambios disruptivos, Jest 27 activaría algunos interruptores para establecer mejores valores predeterminados para proyectos nuevos o que puedan migrar sin problemas. Esto nos da la oportunidad de eliminar algunos paquetes de la distribución predeterminada de Jest 28 y publicarlos como módulos instalables y conectables por separado. Todos los que adopten los nuevos valores predeterminados se beneficiarán de un tamaño de instalación más pequeño, mientras que quienes necesiten estos paquetes aún podrán instalarlos por separado.
Con el primer cambio importante en los valores predeterminados desde los Nuevos valores predeterminados para Jest que llegaron con la versión seminal 15, Jest 27 ya está aquí para mantener Jest rápido, ligero y relevante en el futuro. Explicaremos esos cambios en los valores predeterminados y otros cambios disruptivos notables en esta publicación, pero primero, ¡vamos a conocer algunas características nuevas emocionantes!
Actualizaciones de características
Primero, el modo interactivo que quizás conozcas para revisar y actualizar instantáneas fallidas ahora también se puede usar para avanzar paso a paso por pruebas fallidas una a la vez. El crédito es para el colaborador primerizo @NullDivision por implementar esta función.

Hablando de instantáneas, una de las características más emocionantes que hemos lanzado en los últimos años son las Instantáneas en Línea, que llegaron en una versión menor de Jest 23 hace casi tres años. Sin embargo, venían con la restricción de que los proyectos que quisieran utilizarlas debían usar Prettier para formatear su código, porque eso es lo que Jest usaría para asegurarse de que el archivo en el que escribe las instantáneas permanezca correctamente formateado.
Y así, durante la mayor parte de estos años, hemos tenido una pull request en desarrollo para eliminar esta restricción y permitir el uso de Instantáneas en Línea sin Prettier. Ha acumulado más de cien comentarios, sin siquiera tener en cuenta las PRs derivadas que se implementaron primero, e incluso cambió de propietario una vez después de la presentación inicial por otro colaborador primerizo, @mmkal bajo el divertido título de trabajo 'Uglier Inline Snapshots'. Con el ascenso estelar de Prettier en los últimos tiempos, esta mejora ahora quizás sea menos necesaria que en 2018, pero aún así, conocemos esa sensación de entrar a un proyecto que no usa Prettier y de repente no poder usar instantáneas en línea. ¡Nunca más!
La razón principal por la que nos tomó tanto tiempo implementar esto fue, sorprendentemente, un error de memoria insuficiente en nuestra canalización de compilación. Resulta que las dependencias que cargamos para cada archivo de prueba para realizar el análisis, la inserción de instantáneas y la impresión generan una sobrecarga significativa de tiempo y memoria.
Así que con algunos trucos, hemos acelerado la inicialización por archivo de prueba en aproximadamente un 70% en comparación con Jest 26. Ten en cuenta que casi seguramente no verás una mejora de rendimiento tan grande en tu proyecto: necesitarías muchos archivos de prueba que se ejecuten muy rápido para notarlo mejor, y la sobrecarga al usar un entorno JSDOM eclipsa cualquier mejora de este tipo.
En otras noticias, el soporte nativo para ESM está progresando, pero algunas complejidades importantes, por ejemplo en torno a los mocks, aún están por delante, y seguimos observando la migración a ESM como un enorme esfuerzo de ecosistema, donde Node y muchas herramientas y paquetes cruciales tienen que confiar mutuamente para ofrecer una experiencia global atractiva.
El soporte para ESM para conectar módulos en Jest está más avanzado: los runners personalizados, reporters, watch plugins y muchos otros módulos ya se pueden cargar como módulos ES.
También hemos fusionado un PR para manejar archivos de pruebas con enlaces simbólicos en el directorio de pruebas, una funcionalidad muy solicitada por usuarios de Bazel.
Otro PR permitió que los transforms sean asíncronos, un requisito para soportar transpilación mediante herramientas como esbuild, Snowpack y Vite de manera efectiva.
Cambiando configuraciones por defecto
Hasta ahora, al usar Jest con su configuración predeterminada, estabas ejecutando—quizás sin saberlo—código bifurcado hace años del ejecutor de pruebas Jasmine 2.0, que proporciona funciones como describe, it y beforeEach. En 2017, Aaron Abramov escribió inicialmente un reemplazo para el código de Jasmine llamado jest-circus, diseñado para mejorar mensajes de error, mantenibilidad y extensibilidad.
Tras años de uso a gran escala en Facebook y en el propio Jest, además de su adopción reciente en create-react-app, estamos seguros de que jest-circus es altamente compatible con jest-jasmine2 y funciona en la mayoría de entornos con mínimo esfuerzo de migración. Puede haber diferencias menores en el orden de ejecución y rigurosidad, pero no esperamos problemas graves salvo para código que dependa de APIs específicas de Jasmine como jasmine.getEnv(). Si dependes extensamente de estas APIs, puedes volver al ejecutor basado en Jasmine configurando "testRunner": "jest-jasmine2".
Ejecutar pruebas en un entorno JSDOM conlleva una sobrecarga de rendimiento significativa. Como este era el comportamiento predeterminado de Jest hasta ahora, usuarios que escriben apps Node, por ejemplo, quizás no sabían que recibían un costoso entorno DOM que ni necesitaban.
Por esto cambiamos el entorno de pruebas predeterminado de "jsdom" a "node". Si te afecta este cambio porque usas APIs DOM y no tenías configurado explícitamente el entorno, deberías recibir un error al acceder a document, por ejemplo. Puedes configurar "testEnvironment": "jsdom" o usar configuración por archivo para resolverlo.
Para proyectos mixtos donde algunas pruebas requieren entorno DOM y otras no, recomendamos usar el rápido entorno "node" por defecto y declarar exactamente las pruebas que necesitan DOM mediante docblocks.
En la próxima versión mayor, planeamos también eliminar jest-jasmine2 y jest-environment-jsdom de las dependencias de Jest, requiriendo instalarlos explícitamente, para que muchos usuarios disfruten menor tamaño de instalación sin elementos innecesarios.
Otro valor predeterminado que cambiamos afecta a Fake Timers, también conocidos como Timer Mocks. Introdujimos una implementación "moderna" opcional en Jest 26, accesible mediante la misma API pero con mocking más completo (como para Date y queueMicrotask).
Esta implementación moderna de fake timers será ahora el predeterminado. Si estás entre los pocos afectados por diferencias sutiles de implementación, puedes recuperar la antigua con jest.useFakeTimers("legacy") o, si activas fake timers globalmente mediante configuración, "timers": "legacy".
Funcionalidades con cambios importantes
Introdujimos algunos cambios pequeños más para evitar errores al prohibir acciones que pueden ocurrir fácilmente sin intención:
-
No se puede llamar más de una vez al mismo callback
donede prueba, -
llamar a
doney devolver una Promesa no se pueden combinar, -
un bloque
describeno debe devolver nada,
y hemos hecho algunos tipos de TypeScript más estrictos.
Los módulos usados en las siguientes opciones de configuración ahora se transforman como el resto de tu código, lo que podría ser problemático si dependías de que se cargaran tal cual:
-
testEnvironment -
runner -
testRunner -
snapshotResolver
Cambios roturosos varios
Eliminamos algunas funciones obsoletas desde hace tiempo:
-
jest.addMatchers(usaexpect.extenden su lugar) -
jest.resetModuleRegistry(usajest.resetModulesen su lugar) -
jest.runTimersToTime(usajest.advanceTimersByTimeen su lugar)
Muchos paquetes de Jest han migrado para usar exportaciones estilo ESM (aunque aún se distribuyen como CommonJS), así que si consumes directamente paquetes como pretty-format, quizás necesites ajustar tus importaciones para usar default.
Eliminamos soporte para Node 13, pero Jest siempre soporta las versiones Current y todas las LTS de Node, y Jest 27 sigue soportando Node 10, que recién dejó de tener mantenimiento.
Como siempre, el changelog completo y la lista de cambios roturosos pueden consultarse aquí.
Finalmente, ¡agradecemos a la comunidad por otorgarle a Jest nuevamente una altísima calificación de satisfacción del 96% en la encuesta State of JS 2020! Cuídense todos y esperamos que sigan disfrutando Jest en los próximos años y versiones! 🃏
