Ariel Ayala
ng test --codeCoverage: Inicia los tests y a la vez creo en una carpeta llamada coverage, un reporte web (index.html) para visualizar el estado de las pruebas procesadas.
¿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:
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:
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 para garantizar que los formularios reactivos funcionan adecuadamente.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!
Ariel Ayala
ng test --codeCoverage: Inicia los tests y a la vez creo en una carpeta llamada coverage, un reporte web (index.html) para visualizar el estado de las pruebas procesadas.
William Schnaider Torres Bermon
Cuando se trata de gestionar las dependencias (clases necesarias) del componente a testear disponemos de 4 enfoques:
Ariel Ayala
Porque toda esa configuracion se realiza en el metodo beforeEach() y no en el beforeAll() ?
Juan Pablo Celiz
¡Hola! ¿Cómo estás? Porque la configuración se realiza antes de cada prueba y no un única vez antes de todas. Saludos.
Camilo Tabares
Hola,tengo un componente que tiene en sus dependenciaS AngularFireStorage, al testear me sale el siguiente error: NullInjectorError: R3InjectorError(DynamicTestModule)[AngularFireStorage -> AngularFireStorage]
Nicolas Ticona Valdivia
La definición de TestBed.configureTestingModule no debería ir como beforeAll ?
Elioenai Garcia
Cuando el profe dice que **el comando que tenemos definido ** más bien quiso decir que el test para crear el componente se ejecutó correctamente. U.u
Sergio Andrés Celis León
Anderson Peñaloza
Si estan ejecutando las pruebas en windows 10 y les da error al ejecutar las pruebas con el flag --codeCoverage hay que agregr una nueva entrada en nuestro pckage.json como esta justo despues de la entrada test
"test:coverage": "ng test --no-watch --code-coverage",
luego de esto podemos ejecutar el comando npm run test:coverage y nos generará el reporte
Adicionalmente si el codigo del profesor les está causando problemas, pueden clonar este fork que hice del proyecto el cual lo he actualizado a angular 11 https://github.com/designeromega/mean.git
alguien sabe como solventar este error?
this.formFilter = this.formBuider.group({ operativeAgent: [[], []], actualStatus: [[], []], entryType: [[], []], maintenanceOrigin: [[], []], penaltyType: [[], []], color: [[], []], consecutive: ['', [Validators.maxLength(100), Validators.pattern('^[a-zA-Z0-9 ,]*$')]], area: [[], []], subarea: [[], []], substation: [[], []], elementType: [[], []], element: [[], []], scheduledStartDate: ['', [this.generalService.validateDatesReactive('scheduledStartDate', 'scheduledEndDate')]], scheduledEndDate: ['', [this.generalService.validateDatesReactive('scheduledStartDate', 'scheduledEndDate')]], startWeek: ['', []], endWeek: ['', []], carga: ['', []] });
Error: There is no FormControl instance attached to form control element with name: 'scheduledStartDate'