Обработчик ошибок тестирования Angular Spectator HttpErrorResponse
Обобщите проблему: я хочу протестировать свой собственный ErrorHandler с помощью Spectator и Jest. Я ожидал пройти простой тест, в котором конкретный методhandleFailFastError
называется один раз за HttpErrorResponse
с кодом состояния 500
. Фактический результат состоит в том, чтоHttpErrorResponse
рассматривается как TypeError
в рамках другого метода.
Опишите, что вы пробовали: я проверил, нахожусь ли я внутри метода, и да. Проверено сconsole.log
звонит и распечатывает ошибку. Это{castToWriteable: [Function]}
Объект. Следовательно, мое условие проверить, является ли это экземпляромHttpErrorResponse
не работает, и мой handleError обрабатывает ответ как TypeError. Ориентировался на этом примере. Также проверил эту запись stackru.
Покажите кодErrorHandler:
@Injectable()
export class ErrorHandlerInterceptor implements ErrorHandler, OnDestroy {
private _destroy$ = new Subject();
constructor(
private _injector: Injector
) {
}
public ngOnDestroy(): void {
this._destroy$.next();
this._destroy$.complete();
}
public handleError(error: Error | HttpErrorResponse): void {
console.log('Did i get called?', error);
const failFast: number[] = [401, 403, 500];
if (error instanceof HttpErrorResponse) {
if (navigator.onLine) {
if (failFast.includes(error.status)) {
handleFailFastError();
}
if (error.status === 409) {
//handleConflictError();
}
if (error.status === 400) {
//handleBadRequestError();
}
//handleAnythingElse();
} else {
//Errors, when the user is offline
//handleOfflineError();
}
} else {
//Type errors
console.log('Type Error',error);
//handleTypeError();
}
}
//functions
public handleFailFastError(): void {
console.log('Handled 500');
}
}
Мой тест с использованием зрителя и шутки:
import {ErrorHandlerInterceptor} from './error-handler.interceptor';
import {createServiceFactory} from '@ngneat/spectator';
import {createSpyObject, SpectatorService} from '@ngneat/spectator/jest';
import {HttpErrorResponse} from '@angular/common/http';
import {CoreModule} from '@app/core/core.module';
describe('ErrorHandlerInterceptor', () => {
const createErrorHandler = createServiceFactory({
service: ErrorHandlerInterceptor,
imports: [CoreModule],
mocks: []
});
let specErrorHandler: SpectatorService<ErrorHandlerInterceptor>;
const dummyError = createSpyObject(HttpErrorResponse);
const handleError = (error: HttpErrorResponse): void => {
specErrorHandler.service.handleError(dummyError);
};
beforeEach(() => specErrorHandler = createErrorHandler());
it('should create the error handler', () => {
const errorHandler = specErrorHandler.service;
expect(errorHandler).toBeTruthy();
});
it('at least console should be called 2 times', () => {
const spyConsole = spyOn(console, 'log');
[500].forEach(status => {
handleError(new HttpErrorResponse({status}));
expect(spyConsole).toHaveBeenCalledTimes(5);
});
});
it('should redirect, and delete sessionStorage', () => {
[500].forEach(status => {
handleError(new HttpErrorResponse({status}));
expect(specErrorHandler.service.handleFailFastError).toBeCalled();
});
});
});