Я использую Angular 6 и пишу модульный тест, чтобы проверить, когда HTTP-запрос получает ошибку, отличную от 401
или 404
.
При отладке теста в карма-бегунке я могу получить строку кода с надписью this.router.navigate(['/genericErrorPage'])
для выполнения из-за настройки теста, но не могу пройти тест, и я не уверенпочему тест провалился, так как router.navigate () был фактически вызван во время выполнения теста.
Я пытался шпионить за объектом router
в тесте и объектом mockRouter
в тесте, но ни один из них не заставил тест пройти.При использовании любого шпиона я получаю сообщение «СБОЙ: Ожидается, что шпионская навигация была вызвана».
export class ErrorInterceptor implements HttpInterceptor {
constructor(private router: Router) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
catchError(err => {
if (err.status !== 404 || err.status !== 401) {
this.router.navigate(['/genericErrorPage']);
}
const error = err.statusText;
return throwError(error);
})
);
}}
fdescribe('ErrorInterceptor', () => {
class MockRouter {
navigate = function() {};
}
let router: Router;
let interceptor: ErrorInterceptor;
const mockRouter: MockRouter = new MockRouter();
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: ErrorInterceptor,
multi: true
},
{ provide: Router, useClass: MockRouter }
]
});
router = TestBed.get(Router);
interceptor = new ErrorInterceptor(router);
});
fit('should use router to navigate to error page on error', done => {
spyOn(router, 'navigate');
expect((interceptor as any) instanceof ErrorInterceptor).toBeTruthy();
const next: any = {
handle: (request: HttpRequest<any>) => {
expect(router.navigate).toHaveBeenCalled();
return Observable.create({ hello: 'world' });
}
};
const req = new HttpRequest<any>('GET', 'http://localhost/any/api');
interceptor.intercept(req, next).subscribe(obj => done());
});
});