Прежде чем ответить на ваш вопрос, следует отметить, что методы обслуживания не обязательно должны быть проверены модулем TestBed.configureTestingModule
. Это только для тестирования компонентов или интеграционных тестов. Требуется протестировать завершенные angular жизненные циклы и создание DOM, но нам это не нужно для сервисов модульного тестирования.
Вместо этого вы просто создаете экземпляр своего сервиса в каждом тесте и присваиваете ему зависимости needs.
Чтобы выполнить юнит-тестирование сервисов с сетевыми запросами, вам нужно как смоделировать httpClient
методы, используемые вашими сервисами (httpClient.get
, httpClient.post
, et c.), так и ответ сервера.
1) Чтобы смоделировать метод http.get
, используемый в вашей службе, используйте jasmine.createSpyObj
:
let httpClient: { get: jasmine.Spy };
let service: ExampleService;
beforeEach(() => {
httpClient = jasmine.createSpyObj('HttpClient', ['get']);
service = new ExampleService(<any> httpClient);
});
2) Чтобы смоделировать успешный ответ сервера , мы можем создать вспомогательную функцию, которая обернет данные в обещание. Возможно, вы захотите сохранить эту функцию в папке «test-utils», так как вы будете использовать ее во многих файлах spe c.
export function asyncData<T>(data: T) {
return defer(() => Promise.resolve(data));
}
Если вам нужно смоделировать ошибку сервера, мы просто reject
вместо resolve
обещание:
export function asyncError<T>(errorObject: any) {
return defer(() => Promise.reject(errorObject));
}
3) Теперь вы можете протестировать метаданные службы, которые выполняют сетевые запросы, определив ответ сервера в своем http-шпионе:
it('should return "Yay!"', () => {
const expectedResponse = "Yay!";
httpClientSpy.get.and.returnValue(asyncData(expectedResponse));
service.getData().subscribe(response => {
expect(heroes).toEqual(expectedHeroes, 'expected heroes')
}, fail);
});