Testando componentes Angular2 que usam setInterval ou setTimeout
Eu tenho um componente ng2 simples e bastante típico que chama um serviço para obter alguns dados (itens do carrossel). Ele também usa setInterval para alternar automaticamente os slides do carrossel na interface do usuário a cada n segundos. Funciona muito bem, mas ao executar os testes do Jasmine, recebo o erro: "Não é possível usar o setInterval de dentro de uma zona de teste assíncrona".
Tentei agrupar a chamada setInterval em this.zone.runOutsideAngular (() => {...}), mas o erro permaneceu. Eu pensaria que alterar o teste para executar na zona fakeAsync resolveria o problema, mas recebo um erro dizendo que chamadas XHR não são permitidas na zona de teste fakeAsync (o que faz sentido).
Como posso usar as chamadas XHR feitas pelo serviço e o intervalo, enquanto ainda posso testar o componente? Estou usando o ng2 rc4, projeto gerado pelo angular-cli. Muito obrigado antecipadamente.
Meu código do componente:
constructor(private carouselService: CarouselService) {
}
ngOnInit() {
this.carouselService.getItems().subscribe(items => {
this.items = items;
});
this.interval = setInterval(() => {
this.forward();
}, this.intervalMs);
}
E a partir da especificação Jasmine:
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;
});
}));