У меня есть компонент, который в конечном итоге вызывает несколько HTTP-сервисов через последовательные switchMap
для извлечения данных из бэкэндов.
Я хочу протестировать часть обработки ошибок.Приложение имеет глобальную обработку ошибок (ErrorHandler) и локальную обработку ошибок через catchError.
Метод для проверки выглядит следующим образом:
public methodUsingObservable() {
this.someRequest()
.pipe(catchError((error) => this.handleError(error)))
.subscribe(console.log);
}
Обработка проверки ошибок, если ошибка связанак бизнес-действию и снова выбросить его для обработки глобальным обработчиком
handleError(error) {
checkLocally(error);
return throwError(error);
}
Для моего теста я высмеиваю someRequest
с throwError
, чтобы смоделировать проблему с бэкэнд-вызовом
it('should handle the error when one occurs', fakeAsync(() => {
const service: MachinService = TestBed.get(MachinService);
spyOn(service,'someRequest').and.returnValue(throwError(new Error("Failing HTTP call")));
spyOn(service,'handleError').and.callThrough();
service.methodUsingObservable();
tick();
expect(service.methodUsingObservable).toThrowError();
expect(service.handleError).toHaveBeenCalled();
}));
Однако, как бы я ни шпионил и ожидал чего-то, Карма продолжает считать, что тест провален, потому что подписка, как и ожидалось, выдает необработанную ошибку.
Я пробовал с:
expect(service.methodUsingObservable).toThrowError();
expect(service.methodUsingObservable()).toThrowError();
expect(() => service.methodUsingObservable()).toThrowError();
Но, похоже, никто не научит систему принимать тест как успешный, и тест не пройден.
Chrome 62.0.3202 (Windows 10.0.0) MachinService should handle the error when one occurs FAILED
Error: Failing HTTP call
at UserContext.<anonymous> src/app/shared/services/machin.service.spec.ts:12:64)
...
Как пометить тест как пройденный в этих условиях?