Tests unitarios en monorepo con Nx

Resumen

Si trabajas con un monorepo en Nx, ejecutar tests unitarios deja de ser una tarea tediosa de revisar componente por componente. Nx te permite correr pruebas automatizadas sobre cada unidad mínima de código y, además, cachear los resultados para que las siguientes ejecuciones sean casi instantáneas.

¿Qué es un test unitario y cómo se organiza en Nx?

Un test unitario es una prueba automatizada que verifica el funcionamiento correcto de una unidad mínima de código. En el proyecto, dentro de la carpeta packages, se modifican cuatro carpetas para incorporar archivos de prueba y los ajustes correspondientes en el project.json que habilitan la ejecución.

Cada componente expone un archivo spec.ts que contiene los mocks que simulan el backend y los casos de prueba sobre el comportamiento esperado. Por ejemplo, en el componente de cursos de la aplicación uno encontrarás validaciones como:

  • Debería crearse la aplicación sin errores.
  • Debería tener propiedades iniciales definidas.
  • Debería tener el constructor configurado.
  • Debería poder llamar al método enrollInCourse con un string.
  • Debería tener un método ngOnInit.

Esta misma estructura se replica en la aplicación dos, en los componentes compartidos como botones, tarjetas y tablas, y también en los modelos, donde el spec chequea que el modelo coincida con lo que esperan el backend y el frontend.

¿Para qué sirve un archivo spec.ts? Es el archivo donde defines los tests unitarios y los mocks de un componente. Allí declaras qué debería hacer cada método y simulas dependencias externas como servicios o llamadas al backend.

¿Cómo ejecutar tests con Nx Console y la terminal?

Para correr las pruebas puedes apoyarte en Nx Console dentro del editor o usar la terminal directamente. Desde Nx Console vas a la sección de test, eliges la aplicación y ejecutas. El comando equivalente en consola es:

bash npx nx run app1:test

La primera ejecución de la aplicación uno (estudiantes) procesa 20 de 20 tests en 30 segundos. Al volver a correr el mismo comando, Nx Cloud sirve el resultado desde caché y la ejecución baja a 225 milisegundos, conservando el reporte previo.

La aplicación dos pasa 21 de 21 tests en 6 segundos. Para ui-shared no hay tests configurados, mientras que utils-common ejecuta 1 de 1, correspondiente a los modelos.

¿Por qué el caché de Nx Cloud acelera tanto los tests?

Nx Cloud guarda el resultado de cada ejecución asociado al estado del código. Si nada cambió en los archivos relevantes, no vuelve a correr la prueba: te entrega el reporte cacheado. Por eso pasas de 30 segundos a milisegundos.

El beneficio es velocidad, pero hay un detalle a vigilar. Si un test falla, por ejemplo 19 de 20, y corriges el archivo, existe la posibilidad de que el caché no detecte el cambio. No siempre ocurre, pero puede pasar.

¿Cómo limpio el caché cuando un test queda pegado?

Para estos casos usas el comando:

bash npx nx reset

Este comando borra el caché, detiene el daemon que escucha los cambios y reinicia todo el entorno de Nx. Así eliminas cualquier estado inconsistente que esté afectando tus resultados.

¿Qué hace npx nx reset? Borra el caché local de Nx, detiene el proceso daemon en segundo plano y reinicia el entorno. Úsalo cuando un test corregido siga mostrando el resultado anterior.

¿Cómo correr todos los tests del monorepo con un solo comando?

No necesitas testear proyecto por proyecto. Nx incluye un comando que ejecuta las pruebas de todo el workspace en paralelo:

bash npx nx run-many --target=test --all

Al ejecutarlo, Nx detecta los cuatro proyectos configurados con tests y los corre en una sola pasada. El reporte final indica que pasaron 4 de 4 proyectos, cubriendo aplicaciones, componentes compartidos y utilidades.

Esta es la forma más eficiente de validar un monorepo antes de un merge o un despliegue: un comando, todos los proyectos, y con caché de Nx Cloud trabajando a tu favor para que las corridas siguientes vuelen.

¿Ya estás aplicando estos comandos en tu propio monorepo? Cuéntame en los comentarios qué estrategia de testing usas con Nx.