Tôi có thành phần ng2 khá đơn giản, điển hình gọi một dịch vụ để lấy một số dữ liệu (các mục băng chuyền). Nó cũng sử dụng setInterval để tự động chuyển đổi các trang trình bày băng chuyền trong UI mỗi n giây. Nó hoạt động tốt, nhưng khi chạy thử nghiệm Jasmine tôi nhận được lỗi: "Không thể sử dụng setInterval từ bên trong một vùng thử nghiệm async".Thử nghiệm thành phần Angular2 sử dụng setInterval hoặc setTimeout
Tôi đã thử gói cuộc gọi setInterval trong this.zone.runOutsideAngular (() => {...}), nhưng vẫn còn lỗi. Tôi đã có thể nghĩ rằng việc thay đổi thử nghiệm để chạy trong vùng fakeAsync sẽ giải quyết vấn đề, nhưng sau đó tôi nhận được một lỗi nói rằng XHR cuộc gọi không được phép từ bên trong vùng thử nghiệm fakeAsync (mà không có ý nghĩa).
Làm cách nào để sử dụng cả cuộc gọi XHR do dịch vụ và khoảng thời gian thực hiện, trong khi vẫn có thể kiểm tra thành phần? Tôi đang sử dụng ng2 rc4, dự án được tạo ra bởi angular-cli. Rất cám ơn trước.
Mã của tôi từ các thành phần:
constructor(private carouselService: CarouselService) {
}
ngOnInit() {
this.carouselService.getItems().subscribe(items => {
this.items = items;
});
this.interval = setInterval(() => {
this.forward();
}, this.intervalMs);
}
Và từ spec 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;
});
}));
Rực rỡ, đây chính là điều tôi cần biết. Một điều mà tôi cần thay đổi là trong MockIntervalService: "callback;" gọi lại() { }". Nếu không, nó sẽ dẫn đến "TypeError: this.callback không phải là một hàm". Cảm ơn nhiều! –
Đây là một ý tưởng tuyệt vời và hoạt động tốt. Nó sẽ có ý nghĩa hơn để làm cho một dịch vụ phù hợp với các đối số setTimeout và setInterval thay vì thay đổi chúng. – jsgoupil
Ngoài ra, bạn không thể có hai khoảng thời gian với mã đó vì bạn có thể mất dấu ID nếu bạn cần xóa chúng sau này. Cho rằng tôi sẽ cho IntervalService chỉ là một bản sao của các phương pháp thực sự. – Dunos