使用拦截器测试错误处理程序-空测试套件

时间:2018-07-19 12:27:10

标签: angular angular-test

我有针对http错误的全局错误处理程序:

export class GlobalErrorHandlerComponent implements ErrorHandler, HttpInterceptor {

  constructor(private injector: Injector, private deviceService: DeviceDetectorService) {
  }


  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).do((event: HttpEvent<any>) => {
    }, (error: any) => {
      const router = this.injector.get(Router);
      const service = this.injector.get(ErrorLogService);

      service.logErrors(error, router, this.deviceService);
    });
  }
}

我想测试是否在http错误发生时调用了我的服务函数:

describe('GlobalErrorHandlerComponent', () => {
  let service: ErrorLogService;
  let globalHandler: GlobalErrorHandlerComponent;
  let httpMock: HttpTestingController;
  let httpClient: HttpClient;
  let requestMock: HttpRequest<any>;
  let httpHandlerMock: HttpHandler;
  let errorMock: Error;
  beforeEach(() => TestBed.configureTestingModule({
    imports: [HttpClientTestingModule,DeviceDetectorService,Injector,HttpRequest,HttpHandler,Error],
    providers: [{
      provide: HTTP_INTERCEPTORS,
      useClass: GlobalErrorHandlerComponent,
      multi: true
    }]

  }));

  service = TestBed.get(ErrorLogService);
  httpMock = TestBed.get(HttpTestingController);
  requestMock = TestBed.get(HttpRequest);
  httpHandlerMock = TestBed.get(HttpHandler)

  it('should called service', () => {

    spyOn(service,'logErrors');
    httpMock.expectOne('/error').flush(new Error());

    globalHandler.intercept(requestMock,httpHandlerMock).subscribe(
      ()=> {},(error: HttpErrorResponse) => {
        httpMock.expectOne('/error').flush(new Error());
        expect(service.logErrors).toHaveBeenCalled()
      }
    )
    expect(service.logErrors).toHaveBeenCalled();
  });
});

我尝试做的操作与我在教程/其他堆栈问题中看到的相同,但是我得到了Empty test suite. 如何以正确的方式测试此方法?

0 个答案:

没有答案