首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >httpinterceptor测试失败

httpinterceptor测试失败
EN

Stack Overflow用户
提问于 2018-09-26 04:40:43
回答 1查看 880关注 0票数 1

我正在使用Angular 6,并且正在编写一个单元测试来测试HTTP请求何时得到一个不是401404的错误。

在karma运行器中调试测试时,由于测试设置,我可以获得要执行this.router.navigate(['/genericErrorPage'])的代码行,但我无法使测试通过,而且我不确定测试失败的原因,因为router.navigate( )实际上是在测试执行期间调用的。

我已经尝试对测试中的router对象和测试中的mockRouter对象进行侦察,但都没有使测试通过。当使用任何一个间谍时,我得到“失败:预期的间谍导航已被调用”。

代码语言:javascript
复制
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);
  })
);

}}

代码语言:javascript
复制
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());
  });
});
EN

回答 1

Stack Overflow用户

发布于 2018-09-27 23:14:05

以下是我最终要做的事情:

代码语言:javascript
复制
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from 
'@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { Router } from '@angular/router';

@Injectable()
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 === 401) {
          }
          if (err.status === 404) {
          } else {
              this.router.navigate(['/genericErrorPage']);
          }

         return throwError(err);
        })
      );
     }
    }


import { ErrorInterceptor } from './error-interceptor';
import { Router } from '@angular/router';
import { mock } from 'ts-mockito/lib/ts-mockito';

import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { EmployeeHomeService } from '../../services/employee/employee-home/employee-home.service';
import { USER_PROFILE_API_LOCATION } from '../../constants';

describe('ErrorInterceptor', () => {
   class MockRouter {
    navigate = function() {};
   }
  let employeeHomeService: EmployeeHomeService; //still need to make this generic/mock in case the EmployeeHomeService changes
  let httpMock: HttpTestingController;
  let mockRouter: MockRouter;
  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
       providers: [
        EmployeeHomeService,
        {
           provide: HTTP_INTERCEPTORS,
           useClass: ErrorInterceptor,
           multi: true
        },
         { provide: Router, useClass: MockRouter }
       ]
     });
    mockRouter = TestBed.get(Router);
    employeeHomeService = TestBed.get(EmployeeHomeService);
    httpMock = TestBed.get(HttpTestingController);
   });

  it('should have router redirect to error page on HTTP 500', done => {
    spyOn(mockRouter, 'navigate');
    employeeHomeService.retrieveEmployee().subscribe(
      res => {
        expect(false).toEqual(true); //should not hit here, but if it does, test will fail
        done();
      },
      err => {
     expect(mockRouter.navigate).toHaveBeenCalledWith(['/genericErrorPage']);
         done();
      }
    );

    httpMock.expectOne(USER_PROFILE_API_LOCATION).error(new ErrorEvent('500 
error'), {
       status: 500
     });
     httpMock.verify();
   });
 });



 import { Injectable } from '@angular/core';
 import { HttpClient } from '@angular/common/http';
 import { Observable } from 'rxjs';
 import { Employee } from '../../../containers/employee/models/employee';
 import { USER_PROFILE_API_LOCATION } from '../../../constants';

 @Injectable({
   providedIn: 'root'
})
 export class EmployeeHomeService {
   constructor(private http: HttpClient) {}

  retrieveEmployee(): Observable<Employee> {
    return this.http.get<Employee>(USER_PROFILE_API_LOCATION);
  }
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52506376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档