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,TestBedy 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
titletenga el valor por defecto. - Prueba de Método: Llamamos al método
incrementy verificamos que la propiedadvaluese 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
h1y 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
TestBedpara proporcionar la clase simulada en lugar del servicio real.
Ejercicios Prácticos
Ejercicio 1: Prueba de Propiedad
- Crea un componente con una propiedad
nameque tenga un valor por defecto. - Escribe una prueba que verifique que la propiedad
nametiene el valor por defecto.
Ejercicio 2: Prueba de Método
- Crea un componente con un método
addque sume dos números y almacene el resultado en una propiedadresult. - Escribe una prueba que verifique que el método
addfunciona correctamente.
Ejercicio 3: Prueba de Interacción con el DOM
- Crea un componente que muestre un mensaje en un
ptag. - 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
