esten von Angular2-Komponenten, die setInterval oder setTimeout verwend

Ich habe eine ziemlich typische, einfache ng2-Komponente, die einen Dienst aufruft, um Daten abzurufen (Karussellelemente). Außerdem wird setInterval verwendet, um Karussell-Folien in der Benutzeroberfläche alle n Sekunden automatisch umzuschalten. Es funktioniert einwandfrei, aber beim Ausführen von Jasmine-Tests erhalte ich die Fehlermeldung: "setInterval kann nicht in einer asynchronen Testzone verwendet werden".

Ich habe versucht, den Aufruf von setInterval in this.zone.runOutsideAngular (() => {...}) zu packen, aber der Fehler blieb bestehen. Ich hätte gedacht, dass ein Wechsel des Tests in die fakeAsync-Zone das Problem lösen würde, aber dann erhalte ich die Fehlermeldung, dass XHR-Aufrufe in der fakeAsync-Testzone nicht zulässig sind (was Sinn macht).

Wie kann ich sowohl die XHR-Aufrufe des Dienstes als auch das Intervall verwenden, ohne die Komponente zu testen? Ich benutze ng2 rc4, ein Projekt, das von angle-cli generiert wurde. Vielen Dank im Voraus

Mein Code aus der Komponente:

constructor(private carouselService: CarouselService) {
}

ngOnInit() {
    this.carouselService.getItems().subscribe(items => { 
        this.items = items; 
    });
    this.interval = setInterval(() => { 
        this.forward();
    }, this.intervalMs);
}

Und aus der Jasminspezifikation:

it('should display carousel items', async(() => {
    testComponentBuilder
        .overrideProviders(CarouselComponent, [provide(CarouselService, { useClass: CarouselServiceMock })])
        .createAsync(CarouselComponent).then((fixture: ComponentFixture<CarouselComponent>) => {
            fixture.detectChanges();
            let compiled = fixture.debugElement.nativeElement;
            // some expectations here;
    });
}));

Antworten auf die Frage(6)

Ihre Antwort auf die Frage