Integración de Unit Test con Servicios

Clase 58 de 80Curso de Angular 4

Resumen

Aprende a inyectar un servicio en Angular y a probarlo con unit testing paso a paso. Verás cómo usar Angular CLI, el decorador Injectable, la sección providers del componente y la obtención del servicio en pruebas con fixture.debugElement.injector.get. Todo para asegurar que el componente y el servicio mantienen datos consistentes.

¿Cómo se crea e inyecta un servicio en Angular?

Crear y usar un servicio dedicado mejora la organización y reutilización del código. Aquí se define un arreglo de lugares con id y name, y un método para exponerlos.

¿Cómo definir el servicio con injectable y get places?

  • Decorar con @Injectable para habilitar la inyección de dependencias.
  • Exportar la clase PlacesService.
  • Declarar un array de lugares con id y name.
  • Exponer un método getPlaces que hace return del arreglo.
import { Injectable } from '@angular/core';

@Injectable()
export class PlacesService {
  places = [
    { id: 1, name: '...' },
    { id: 2, name: '...' },
  ];

  getPlaces() {
    return this.places;
  }
}

¿Cómo inyectarlo con providers en el componente?

  • Declarar el servicio en providers del componente para uso exclusivo del componente.
  • Inyectar en el constructor con una propiedad private placesService: PlacesService.
  • Evitar agregarlo en app.module.ts cuando solo se usa en este componente.
@Component({
  selector: 'app-place',
  providers: [PlacesService],
  template: '...'
})
export class PlaceComponent {
  places = [];

  constructor(private placesService: PlacesService) {
    this.places = this.placesService.getPlaces();
  }
}

¿Cómo se prueba el servicio desde el componente con unit testing?

La meta es validar que el componente expone los mismos datos que el servicio. Se crea un test: “should have the same places as the service”.

¿Cómo obtener el servicio en el test con fixture.debugElement.injector.get?

  • Crear el fixture del componente.
  • Obtener la instancia del servicio con fixture.debugElement.injector.get.
  • Reutilizar las primeras líneas de configuración del test anterior.
it('should have the same places as the service', () => {
  const fixture = TestBed.createComponent(PlaceComponent);
  const app = fixture.componentInstance;

  const placeService = fixture.debugElement.injector.get(PlacesService);
  // comparación abajo
});

¿Cómo hacer la aserción con expect y toEqual?

  • Usar expect para comparar referencias de datos.
  • Validar que app.places y placeService.places sean iguales con toEqual.
expect(app.places).toEqual(placeService.places);

¿Qué ajustes en el componente hacen pasar el test?

  • Declarar el array places en el componente: places = [].
  • Asignar en el constructor: this.places = this.placesService.getPlaces().
  • Corregir typos en expect si aparecen.
  • Confirmar que providers incluye el servicio para que no falle la inyección.

¿Qué comandos y próximos pasos consolidan el aprendizaje?

Asegura la ejecución correcta de las pruebas y sigue las recomendaciones didácticas.

¿Cómo ejecutar ng test y revisar en localhost 9877?

  • Correr ng test para lanzar Karma y el navegador.
  • Si no abre, ingresar a localhost:9877 manualmente.
  • Verificar que pasan los tests del AppComponent generado por Angular 4 y los del PlaceComponent.

¿Qué tareas sugiere el instructor para practicar?

  • Implementar al menos cinco unit tests en la app de Plazy Square.
  • Revisar el recurso oficial de Angular testing para profundizar.
  • Compartir los resultados con la comunidad.
  • Prepararse para el siguiente módulo: RxJS.

¿Tienes dudas, ideas de casos de prueba o quieres mostrar tus resultados? Compártelos en comentarios y sigamos mejorando juntos.