HttpTestingController不适用于HTTP_INTERCEPTORS

时间:2018-09-10 20:50:27

标签: angular unit-testing jasmine karma-jasmine angular-http-interceptors

在此测试中需要做的是,预期请求成功到达backend(在这种情况下为HttpTestingController),在客户端和后端之间,拦截器拦截请求。拦截器会先检查并设置条件,然后再打开或按住直到满足条件。

对于当前问题,如果将HTTP_INTERCEPTORS添加到提供程序中,则HttpTestingControllermockBackend停止工作,并且无法使用调试器和任何示例来说明这可能是问题的原因。错误消息由业力给出。

Error: Expected one matching request for criteria "Match URL: /example", found none.

在提供程序中删除HTTP_INTERCEPTORS之后,它再次开始工作,但是我无权访问interceptorService,并且无法检查某些条件。最后,拦截器似乎在单元测试中不起作用,可能是因为我的home.component.tsinterceptorService之间的层太多了。

我查看了这个question on stackoverflow,但是我相信调用的顺序是正确的,并且我使用了这个link的示例来创建带有拦截器的测试。

http.service.ts

refreshSession(): Promise<boolean> {
 return http.get(url, {}).then(()=>true).catch(()=>false);
}

app.spec.ts

beforeEach(() => {
 TestBed.ConfigureTestingModule({
  declarations: [ home.spec.ts ],
  imports: [ HttpClientTestingModule ],
  providers: [
   interceptorService,
   {
    provide: HTTP_INTERCEPTORS,
    useClass: interceptorService,
    multi: true,
   },
  ],
 });
  http = TestBed.get(HttpService);
  interceptor = TestBed.get(interceptorService);
  mockBackend = TestBed.get(HttpTestingController);
});

it('http requests make to the end', () => {
    http.refreshSession().then(hasRefreshed => {
      expect(hasRefreshed).toBeTruthy();
    });
    let header = new HttpHeaders();
    header = header.append('token', 'abc');
    let response = new HttpResponse({
      status: 200,
      headers: header,
    });
    interceptor.token = '123';
    expect(interceptor.token).toBeDefined();
    let backend = mockBackend.expectOne({
      url: '/example',
      method: 'GET',
    });
    backend.flush(response);
  });

0 个答案:

没有答案