Eckige 2 - test für den Wandel in der route, params
Habe ich eine Komponente im Winkel 2, die reagiert auf änderungen in der route-Parameter (Komponente laden nicht von Grund auf, weil wir nicht verschieben die Hauptroute. Hier ist die Komponente-code:
export class MyComponent{
ngOnInit() {
this._routeInfo.params.forEach((params: Params) => {
if (params['area']){
this._pageToShow =params['area'];
}
});
}
}
Diesem Werk behandeln und _pageToShow
festgelegt ist, angemessen auf die navigation.
Ich versuche zu testen, die Verhalten auf eine Veränderung der route (also einen zweiten Auslöser der beobachtbaren, aber es ist die Weigerung, zu arbeiten für mich.) Hier ist mein Versuch:
it('sets PageToShow to new area if params.area is changed', fakeAsync(() => {
let routes : Params[] = [{ 'area': "Terry" }];
TestBed.overrideComponent(MyComponent, {
set: {
providers: [{ provide: ActivatedRoute,
useValue: { 'params': Observable.from(routes)}}]
}
});
let fixture = TestBed.createComponent(MyComponent);
let comp = fixture.componentInstance;
let route: ActivatedRoute = fixture.debugElement.injector.get(ActivatedRoute);
comp.ngOnInit();
expect(comp.PageToShow).toBe("Terry");
routes.splice(2,0,{ 'area': "Billy" });
fixture.detectChanges();
expect(comp.PageToShow).toBe("Billy");
}));
Aber das wirft ein TypeError: Cannot read property 'subscribe' of undefined
Ausnahme, wenn ich ihn laufen. Wenn ich es ohne die fixture.detectChanges();
Linie, auf der es nicht wie die zweite Erwartung schlägt fehl.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, sollten Sie eine
Subject
statt einerObservable
. Die beobachtbaren bekommt nur abonniert, um einmal. Also es wird nur emittieren der erste Satz von Parametern. Mit einemSubject
können Sie halten emittierende Elemente, und die einzigen Abonnement halten, Sie zu erhalten.Dann in Ihrem test nur emittieren neue Werte mit
params.next(newValue)
.Zweitens, müssen Sie sicherstellen, anrufen
tick()
. Dies ist, wiefakeAsync
funktioniert. Sie Steuern die asynchrone task-Auflösung. Da die beobachtbaren als asychrounous, der moment, in dem wir geschickt die Falle, es wird nicht an den Abonnenten synchron. Also müssen wir, um Kraft synchron Verhalten mittick()
Hier ist eine komplette test (
Subject
ist importiert aus'rxjs/Subject'
)tick()
Funktion! Ich völlig verpasst, dass die erste Zeit. Vielen Dank für die Lösung, dieser arbeitete für mich 🙂fragment
auch für interne links:fragment = new Subject<string>();
, die entsprechende aus - /einblenden der Registerkarte Inhalt, zum Beispiel.Ich mir lieber die route params und Daten aus ActivatedRouteSnapshot wie diese
this.route.snapshot.params['type']
Wenn Sie die gleiche Art und Weise können Sie testen, wie diese
1) In der test-Anbieter
2) die in den test-spec