Todo está en el título: ¿cómo se puede probar lo que se hace en el constructor del componente?
Para su información, estoy usando un servicio que requiere una configuración y me gustaría ver si los 2 métodos que llamo en el constructor se llaman correctamente.
El constructor de mi componente:
constructor( public router: Router, private profilService: ProfileService, private dragula: DragulaService, private alerter: AlertService ) { dragula.drag.subscribe((value) => { this.onDrag(value); }); dragula.dragend.subscribe((value) => { this.onDragend(value); }); }Inyectaría un servicio falso usando el sistema DI, lo que significaría escribir las pruebas de esta manera:
describe('your component', () => { let fixture: ComponentFixture<YourComponent>; let fakeService; let dragSubject = new ReplaySubject(1); ... beforeEach(async(() => { fakeService = { drag: dragSubject.asObservable(), ... }; TestBed.configureTestingModule({ declarations: [YourComponent, ...], providers: [ { provide: DragulaService, useValue: fakeService }, ... ], }); })); beforeEach(() => { fixture = TestBed.createComponent(YourComponent); fixture.detectChanges(); }); it('should do something when a drag event occurs', () => { dragSubject.next({ ... }); fixture.detectChanges(); ... }); }); Esto le permite activar "eventos de arrastre" cuando lo desee llamando a .next sobre el tema, lo que hace que se llame a los suscriptores de los campos en el servicio falso. Luego puede hacer afirmaciones sobre los resultados que espera de eso.
Tenga en cuenta que no necesita llamar al constructor usted mismo; este método se invoca cuando el sistema DI crea una instancia de su componente, es decir, cuando se llama TestBed.createComponent .
Recomendaría que no espíes los métodos de los componentes (p. ej. this.onDrag ) y solo te asegures de que los llamen, sino que pruebes que lo que sea que esos métodos deban hacer como resultado suceda; esto hace que las pruebas sean más robustas a los cambios en la implementación específica (escribí un poco sobre esto en mi blog: http://blog.jonrshar.pe/2017/Apr/16/async-angular-tests.html ).
La forma sencilla de probar cualquier cosa dentro de la función constructora es crear una instancia de componente y luego probarla.
it('should call initializer function in constructor', () => { TestBed.createComponent(HomeComponent); // this is the trigger of constructor method expect(sideNavService.initialize).toHaveBeenCalled(); // sample jasmine spy based test case }); Una cosa a tener en cuenta es que, si desea distinguir entre constructor y ngOnInit, no llame a fixture.detectChanges() dentro beforeEach() . en su lugar, llame manualmente cuando lo necesite.
Dado que OP dice "Me gustaría ver si los 2 métodos a los que llamo en el constructor se llaman correctamente". Tengo un mejor enfoque.
Escribe una prueba unitaria. No necesita usar el banco de pruebas para esto. Ralentizará mucho tus pruebas. Instancia tus simulacros manualmente. Establezca sus espías en los métodos que le interesan y luego llame al constructor del componente manualmente con los stubs que ha creado instancias y en los que ha configurado los espías. Luego pruebe si los métodos espiados se han llamado correctamente.
La clave es extender sus stubs de las clases de servicio originales. jasmine.createSpyObj ayuda a burlarse de clases angulares como Router .