Las pruebas de componentes en Angular son esenciales para asegurar que cada componente de tu aplicación funcione correctamente de manera aislada. En este tema, aprenderás cómo configurar y escribir pruebas unitarias para componentes utilizando Jasmine y Karma, que son las herramientas de prueba predeterminadas en Angular.
Contenido
Configuración del Entorno de Pruebas
Angular CLI configura automáticamente Jasmine y Karma cuando creas un nuevo proyecto Angular. Para ejecutar las pruebas, simplemente usa el siguiente comando:
Este comando iniciará Karma, que ejecutará todas las pruebas y mostrará los resultados en la consola y en el navegador.
Estructura de una Prueba de Componente
Cada componente en Angular tiene un archivo de prueba asociado con la extensión .spec.ts
. A continuación, se muestra un ejemplo básico de una prueba de componente:
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MyComponent } from './my-component.component'; describe('MyComponent', () => { let component: MyComponent; let fixture: ComponentFixture<MyComponent>; beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ MyComponent ] }) .compileComponents(); }); beforeEach(() => { fixture = TestBed.createComponent(MyComponent); component = fixture.componentInstance; fixture.detectChanges(); }); it('should create', () => { expect(component).toBeTruthy(); }); });
Explicación del Código
- Importaciones: Importamos
ComponentFixture
,TestBed
y el componente que vamos a probar. - describe: Define un grupo de pruebas.
- beforeEach: Configura el entorno de pruebas antes de cada prueba individual.
- TestBed.configureTestingModule: Configura un módulo de prueba con el componente que vamos a probar.
- compileComponents: Compila los componentes declarados.
- beforeEach: Crea una instancia del componente y detecta los cambios.
- it: Define una prueba individual. En este caso, estamos verificando que el componente se crea correctamente.
Pruebas de Propiedades y Métodos
Puedes probar las propiedades y métodos de un componente de la siguiente manera:
it('should have a default title', () => { expect(component.title).toBe('default title'); }); it('should increment value', () => { component.increment(); expect(component.value).toBe(1); });
Explicación del Código
- Prueba de Propiedad: Verificamos que la propiedad
title
tenga el valor por defecto. - Prueba de Método: Llamamos al método
increment
y verificamos que la propiedadvalue
se haya incrementado.
Pruebas de Interacción con el DOM
Para probar la interacción con el DOM, puedes usar fixture.nativeElement
o fixture.debugElement
:
it('should display the title in a h1 tag', () => { const compiled = fixture.nativeElement; expect(compiled.querySelector('h1').textContent).toContain('default title'); });
Explicación del Código
- fixture.nativeElement: Accede al DOM del componente.
- querySelector: Selecciona el elemento
h1
y verifica que su contenido de texto contenga el título por defecto.
Pruebas de Componentes con Dependencias
Si tu componente depende de servicios u otros componentes, puedes usar TestBed
para proporcionar dependencias simuladas (mocks):
import { MyService } from './my-service.service'; class MockMyService { getValue() { return 'mock value'; } } beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [ MyComponent ], providers: [ { provide: MyService, useClass: MockMyService } ] }) .compileComponents(); });
Explicación del Código
- MockMyService: Creamos una clase simulada que reemplaza al servicio real.
- providers: Usamos
TestBed
para proporcionar la clase simulada en lugar del servicio real.
Ejercicios Prácticos
Ejercicio 1: Prueba de Propiedad
- Crea un componente con una propiedad
name
que tenga un valor por defecto. - Escribe una prueba que verifique que la propiedad
name
tiene el valor por defecto.
Ejercicio 2: Prueba de Método
- Crea un componente con un método
add
que sume dos números y almacene el resultado en una propiedadresult
. - Escribe una prueba que verifique que el método
add
funciona correctamente.
Ejercicio 3: Prueba de Interacción con el DOM
- Crea un componente que muestre un mensaje en un
p
tag. - Escribe una prueba que verifique que el mensaje se muestra correctamente en el DOM.
Soluciones
Solución Ejercicio 1
// Componente export class MyComponent { name: string = 'default name'; } // Prueba it('should have a default name', () => { expect(component.name).toBe('default name'); });
Solución Ejercicio 2
// Componente export class MyComponent { result: number; add(a: number, b: number) { this.result = a + b; } } // Prueba it('should add two numbers', () => { component.add(1, 2); expect(component.result).toBe(3); });
Solución Ejercicio 3
// Componente export class MyComponent { message: string = 'Hello, World!'; } // Plantilla <p>{{ message }}</p> // Prueba it('should display the message in a p tag', () => { const compiled = fixture.nativeElement; expect(compiled.querySelector('p').textContent).toContain('Hello, World!'); });
Conclusión
En esta sección, has aprendido cómo configurar y escribir pruebas unitarias para componentes en Angular. Las pruebas de componentes son cruciales para asegurar que cada parte de tu aplicación funcione correctamente de manera aislada. A medida que avances, te encontrarás con componentes más complejos que interactúan con servicios y otros componentes, y las habilidades que has adquirido aquí te ayudarán a mantener la calidad y la fiabilidad de tu código.
En el siguiente tema, exploraremos las pruebas de servicios, donde aprenderás a probar la lógica de negocio y las interacciones con APIs externas.
Curso de Angular 2+
Módulo 1: Introducción a Angular
- ¿Qué es Angular?
- Configuración del Entorno de Desarrollo
- Tu Primera Aplicación Angular
- Arquitectura de Angular
Módulo 2: Conceptos Básicos de TypeScript
- Introducción a TypeScript
- Variables y Tipos de Datos en TypeScript
- Funciones y Funciones Flecha
- Clases e Interfaces
Módulo 3: Componentes y Plantillas
- Creación de Componentes
- Plantillas de Componentes
- Estilos de Componentes
- Interacción entre Componentes
Módulo 4: Directivas y Pipes
Módulo 5: Servicios e Inyección de Dependencias
- Introducción a los Servicios
- Creación y Uso de Servicios
- Inyección de Dependencias
- Inyectores Jerárquicos
Módulo 6: Enrutamiento y Navegación
Módulo 7: Formularios en Angular
- Formularios Basados en Plantillas
- Formularios Reactivos
- Validación de Formularios
- Formularios Dinámicos
Módulo 8: Cliente HTTP y Observables
- Introducción al Cliente HTTP
- Realizando Solicitudes HTTP
- Manejo de Respuestas HTTP
- Uso de Observables
Módulo 9: Gestión de Estado
- Introducción a la Gestión de Estado
- Uso de Servicios para la Gestión de Estado
- NgRx Store
- NgRx Effects