Pruebas Unitarias en Angular: Simulación de Servicios y Componentes

Clase 27 de 38Curso de Unit Testing para MEAN con Jasmine

Resumen

¿Cómo configurar pruebas unitarias en un componente de formulario en Angular?

Al trabajar con componentes en Angular, en especial para aplicaciones web complejas, realizar pruebas unitarias es fundamental para garantizar que cada funcionalidad opere de manera correcta y sin errores. En este caso, analizaremos cómo llevar a cabo pruebas unitarias eficaces para un componente de formulario utilizando Angular y ciertas herramientas complementarias.

¿Cómo se estructuran los formularios en Angular usando Material UI?

En la aplicación, se ha diseñado un componente llamado form dentro de la carpeta componentes, estructurado con ayuda de Material UI. Este componente se compone de dos formularios:

  • Primer Formulario: Solicita un título, un autor y una descripción.
  • Segundo Formulario: Requiere del usuario una URL y un tema específico, utilizando un selector con Material Form Field.

Para manejar estos formularios, se emplean formularios reactivos de Angular, lo que permite una integración fluida con servicios de Angular y facilita la gestión de datos de los formularios.

¿Cómo iniciar las pruebas unitarias para aislar un componente?

Es crucial separar el componente que se desea probar de cualquier clase o servicio no necesario para las pruebas, asegurando así que únicamente se testea el comportamiento del componente. Se utiliza un testbed para configurar el entorno de pruebas del componente. Un aspecto clave de este proceso es crear simulaciones o "stabs" para emular las clases a ser probadas:

  • Simulación de Servicios: Emplear clases ficticias que terminen en Stab para reemplazar los servicios originales y simular sus comportamientos.
class SaveFinsStab {
  saveFins() {
    return of(true); // Simula un observable que retorna `true`
  }
}

class NavigateStab {
  gotoPins() {} // Función vacía simulando la navegación
}

class SnackbarStab {
  open() {
    return {
      afterDismissed: () => of({}) // Observa el comportamiento de afterDismissed
    }
  }
}

¿Qué se necesita incluir en el testbed para integrar configuraciones adicionales?

Es indispensable registrar los providers de estas clases simuladas y cualquier módulo adicional que el componente requiera:

  • ReactiveFormsModule: Importar ReactiveFormsModule para garantizar que los formularios reactivos funcionan adecuadamente.
  • Esquemas en Angular: Aplicar NO_ERRORS_SCHEMA y CUSTOM_ELEMENTS_SCHEMA para evitar errores relacionados con el esquema al reconocer etiquetas personalizadas de Material UI.
TestBed.configureTestingModule({
  providers: [
    { provide: SaveFinsService, useClass: SaveFinsStab },
    { provide: NavigationService, useClass: NavigateStab },
    { provide: SnackbarService, useClass: SnackbarStab }
  ],
  imports: [ReactiveFormsModule],
  schemas: [NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA]
});

¿Cómo asegurar que un componente Angular se inicializa correctamente?

Cada vez que se prueba la creación de un componente, Angular CLI genera pruebas unitarias básicas que verifican que el componente se define correctamente.

it('should create', () => {
  expect(component).toBeTruthy();
});

Con esto, se garantiza que, al realizar pruebas, el componente y sus dependencias se integren correctamente, permitiendo una ejecución sin errores en el entorno de pruebas.

¿Cómo ejecutar y verificar las pruebas unitarias correctamente?

Para comprobar la correcta ejecución de las pruebas unitarias, basta con compilar el proyecto y observar el reporte de coverage, que exhibe gráficamente las partes del código que han sido evaluadas con éxito. Además, al ejecutar pruebas, es útil incluir el flag code coverage para obtener reportes más detallados y proceder con la optimización del código.

ng test --code-coverage

Al fomentar una cultura de pruebas unitarias, se garantiza que la aplicación se mantenga robusta y permite un desarrollo más seguro y eficiente. ¡Asegúrate de seguir explorando y refinando tus habilidades de pruebas unitarias para elevar tus proyectos al siguiente nivel!