在此测试中需要做的是,预期请求成功到达backend
(在这种情况下为HttpTestingController
),在客户端和后端之间,拦截器拦截请求。拦截器会先检查并设置条件,然后再打开或按住直到满足条件。
对于当前问题,如果将HTTP_INTERCEPTORS
添加到提供程序中,则HttpTestingController
或mockBackend
停止工作,并且无法使用调试器和任何示例来说明这可能是问题的原因。错误消息由业力给出。
Error: Expected one matching request for criteria "Match URL: /example", found none.
在提供程序中删除HTTP_INTERCEPTORS
之后,它再次开始工作,但是我无权访问interceptorService
,并且无法检查某些条件。最后,拦截器似乎在单元测试中不起作用,可能是因为我的home.component.ts
到interceptorService
之间的层太多了。
我查看了这个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);
});