Тестирование компонентов Angular2, которые используют setInterval или setTimeout
У меня есть довольно типичный, простой компонент ng2, который вызывает сервис для получения некоторых данных (элементы карусели). Он также использует setInterval для автоматического переключения слайдов карусели в пользовательском интерфейсе каждые n секунд. Это работает просто отлично, но при запуске тестов Jasmine я получаю сообщение об ошибке: «Невозможно использовать setInterval из асинхронной тестовой зоны».
Я попытался обернуть вызов setInterval в this.zone.runOutsideAngular (() => {...}), но ошибка осталась. Я бы подумал, что изменение теста для запуска в зоне fakeAsync решит проблему, но тогда я получаю сообщение об ошибке, в котором говорится, что вызовы XHR не разрешены из зоны тестирования fakeAsync (что имеет смысл).
Как я могу использовать как вызовы XHR, сделанные службой, так и интервал, все еще имея возможность протестировать компонент? Я использую ng2 rc4, проект, созданный angular-cli. Спасибо заранее.
Мой код из компонента:
constructor(private carouselService: CarouselService) {
}
ngOnInit() {
this.carouselService.getItems().subscribe(items => {
this.items = items;
});
this.interval = setInterval(() => {
this.forward();
}, this.intervalMs);
}
И из спецификации Жасмин:
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;
});
}));