Я не совсем понимаю, как издеваться над тем, что мой http-сервис ловит заметную ошибку. Я прочитал угловую документацию, но я не понимаю, как бы я структурировал тест. Я хотел бы посмеяться над ошибкой в моем сервисе, а затем убедиться, что он фиксирует наблюдаемую ошибку У меня есть другой сервис, который создает и выбрасывает наблюдаемую ошибку. Остальные мои сервисы просто ловят его при возникновении ошибки. Я, честно говоря, очень смущен тем, как это реализовать. Вот простая версия моего сервиса, а также сервис ошибок:
getData(url: string): Observable<any> {
return this.http.get(url)
.map(this.extractData)
.catch(this.handleErrorObservable);
}
handleErrorObservable(error: Response | any) {
console.error(error.message || error);
return Observable.throw(error.message || error);
}
Теперь, как бы я смоделировал ошибку? Нужно ли шпионить за сервисом и заставить его выйти из строя? Будет ли что-то вроде spyOn(service, 'getData).and.returnValue(Observable.throw({status: 404})))
или я смотрю на это неправильно? Спасибо.
РЕДАКТИРОВАТЬ: Код с решением Кастро Роя.
import {HttpErrorResponse, } from '@angular/common/http';
import { TestBed, inject } from '@angular/core/testing'
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing'
import {HttpService} from '../services/http.service'
fdescribe('MyService', () => {
let httpTestingController: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [HttpService]
});
httpTestingController = TestBed.get(HttpTestingController);
});
afterEach(() => {
httpTestingController.verify();
});
it('should be created', inject([HttpService], (service: HttpService)=> {
expect(service).toBeTruthy();
}));
it('should handleErrorObservable', inject([HttpService], (service: HttpService) => {
const urlString = '/data';
const emsg = 'deliberate 404 error';
spyOn(service, 'handleErrorObservable').and.callThrough();
service.getData(urlString).subscribe(
data => fail('should have failed with the 404 error'),
(error: HttpErrorResponse) => {
expect(service.handleErrorObservable).toHaveBeenCalled(); // check if executed
expect(error.status).toEqual(404, 'status');
expect(error.error).toEqual(emsg, 'message');
});
const req = httpTestingController.expectOne(urlString);
req.flush(emsg, { status: 404, statusText: 'Not Found' });
}));
});