2016-07-15 9 views
12

Ich bin Einheit Testen einer Komponente und das ist zu Ende bringen, was ich habe:für ngOnInit Warten in Jasmine Angular2

describe('Component: nav',() => { 

    beforeEach(() => addProviders([ 
    provide(UserService, {useClass: MockUserService}), 
    NavComponent 
    ])); 

    it('should have a property \'firstName\' with the value \'Crazypug\'', 
    async(inject([NavComponent], (component) => { 
     component.ngOnInit(); 
     expect(component.firstName).toEqual('Crazypug') 
    })) 
); 

}); 

Dies ist die ngOnInit Funktion:

ngOnInit() { 
    this.userService.getFirstNameCall().subscribe(
     data => {this.firstName = data.firstname; }); 
} 

Wenn ich den Test ausführen ich bekomme:

undefined voraussichtlich gleich 'Crazypug'

Wie kann ich Jasmine warten lassen, bis die ngOnInit-Funktion beendet ist? Ich habe einige Lösungen auf SO gefunden, aber vor langer Zeit (in angular2 Zeitpunkten). Sie waren sehr kompliziert oder veraltet.

Antwort

12

Sie sollten async Funktion für fakeAsync

import {..., tick, fakeAsync} from '@angular/core/testing'; 
... 
fakeAsync(inject([NavComponent], (component) => { 
    component.ngOnInit(); 
    tick(); 
    expect(component.firstName).toEqual('Crazypug') 
})) 
+0

meine ngOnInit eine http.get ruft (über Service-Methode) und bei seiner Rückkehr, setzt die Daten auf den empfangenen Wert ersetzen. Wenn ich den Testcode in einem setTimeout einpacke, ist es erfolgreich, aber die Tick-Methode scheint nicht zu funktionieren (selbst wenn ein Timeout wie der setTimeout-Wert angegeben wurde). Nicht sicher, warum – Nitin