Я продолжаю сталкиваться с этой ошибкой, когда пытаюсь выполнить модульное тестирование любой из моих функций, использующих службу в моем классе компонентов. Вот часть моей функции.
loadUser() {
this.httpService.getData(AppConfig.URL_UserById + "?UserID=" + this.userId)
.catch((error: Response | any) => {
this.showAlertWindow(this.exceptionMessage);
console.error(error.message || error);
return Observable.throw(error.message || error);
})
Эта часть извлекает данные из URL и выдает ошибку, если есть проблема. getData - это сервис, который делает запрос get. Я просто пытаюсь проверить, вызывается ли метод showAlertWindow. Теперь я почти уверен, что мой тестовый код правильный, но мне что-то не хватает, чтобы получить эту ошибку. Я предполагаю, что Жасмин не знает, что делать со строкой this.httpService.getData(...)
Спасибо.
Тест:
fit('should have getUsers() call showAlertWindow', () => {
let window = spyOn(userComponent, 'showAlertWindow');
userComponent.loadUser(); //Fails here
expect(window).toHaveBeenCalled();
})
Полная ошибка:
Error: Cannot call Promise.then from within a sync test.
Error: Cannot call Promise.then from within a sync test.
at SyncTestZoneSpec.webpackJsonp../node_modules/zone.js/dist/zone-testing.js.SyncTestZoneSpec.onScheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:365:1)
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:401:1)
at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.scheduleTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:232:1)
at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.scheduleMicroTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:252:1)
at scheduleResolveOrReject (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:862:1)
at ZoneAwarePromise.then (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:962:1)
at ApplicationInitStatus.webpackJsonp../node_modules/@angular/core/esm5/core.js.ApplicationInitStatus.runInitializers (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/core.js:3580:1)
at TestBed.webpackJsonp../node_modules/@angular/core/esm5/testing.js.TestBed._initIfNeeded (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/testing.js:1011:1)
at TestBed.webpackJsonp../node_modules/@angular/core/esm5/testing.js.TestBed.get (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/testing.js:1050:1)
at Function.webpackJsonp../node_modules/@angular/core/esm5/testing.js.TestBed.get (http://localhost:9876/_karma_webpack_/webpack:/node_modules/@angular/core/esm5/testing.js:834:1)
Если кто-нибудь может дать мне некоторое представление о значении этой ошибки, это было бы здорово. Спасибо.
Тестовая конфигурация:
import { HttpService } from '../../services/http.service';
import { TestBed, async, inject, fakeAsync, ComponentFixture } from "@angular/core/testing";
import { UserComponent } from './user.component';
import { Observable } from 'rxjs';
fdescribe('User Component', () => {
let httpService: HttpService;
let userComponent: UserComponent
beforeEach(async() => {
TestBed.configureTestingModule({
declarations: [
UserComponent,
],
providers: [
HttpService,
],
}).compileComponents();
});
beforeEach(() => {
userComponent = fixture.componentInstance;
httpService = TestBed.get(HttpService);
fit('should have getUsers() call showAlertWindow', () => {
let window = spyOn(userComponent, 'showAlertWindow');
userComponent.loadUser();
expect(window).toHaveBeenCalled();
})
Редактировать: Есть два возможных решения. Я решил ошибку, следя за моим сервисом и возвращая наблюдаемое. spyOn(httpService, 'getData).and.returnValue(Observable.of('test'));
Или решение JanRecker, которое более практично.