Что необходимо сделать в этом тесте, ожидается, что запрос успешно достигнет backend
(в данном случае HttpTestingController
), а между клиентом и бэкэндом перехватчики перехватывают запрос.Перехватчики проверяют и устанавливают условия перед тем, как включить или удерживать их до тех пор, пока они не будут выполнены.
Для текущей проблемы, если к поставщикам добавлено HTTP_INTERCEPTORS
, HttpTestingController
aka mockBackend
перестает работать и не может использовать отладчики любые примеры, чтобы показать, почему это может быть проблемой.Сообщение об ошибке дает карма.
Error: Expected one matching request for criteria "Match URL: /example", found none.
После удаления HTTP_INTERCEPTORS
в провайдере он снова начинает работать, но у меня нет доступа к interceptorService
и я не могупроверьте некоторые условия.Наконец, перехватчик, кажется, не работает в модульном тесте, может быть, у меня слишком много слоев между моим home.component.ts
и моим interceptorService
.
Я смотрел на этот вопрос о stackoverflow , но я считаю, что порядок, который я назвал, правильный, и я использую пример из этой ссылки , чтобы создать свой тест с перехватчиком.
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);
});