Тестирование блока деталей с угловыми наблюдаемыми погрешностями с использованием jasmine

#angular #observable #karma-jasmine #subscribe

Вопрос:

У меня есть функция ниже в моем угловом сервисе «config.service.ts». Я написал несколько модульных тестов для того же самого, и я не могу покрыть часть ошибок метода подписки.

 getConfiguration(params){
  return new Promise((resolve, reject) => {
    try {
      this.httpService.post('getConfig', params).subscribe{
        data => {
         resolve(data);
        },
        error => {
         reject(error);
        }
      };
    } catch(error) {
     reject(error);
    }
  });
}
 

Ниже приведен код «config.service.spec.ts». Пожалуйста, дайте мне знать, как покрыть часть ошибки подписки для того же самого.

 it('coverage for getConfiguration()', () => {
 const service: ConfigService = Testbed.get(ConfigService);
 const param = {id: 10};
 const response = {success: true};
 const httpService: HttpService = Testbed.get(HttpService);
 spyOn(httpService, 'post').and.returnValue(of(response));
 service.getConfiguration(param).then(function() {});
 expect(service.getConfiguration).toBeTruthy();
});
 

Здесь наблюдаемая часть ошибки не покрывает и не может достичь покрытия. Пожалуйста, поправьте меня, если здесь что-то не так.

Комментарии:

1. У кого-нибудь есть какое-либо решение для этого. Пожалуйста, дайте знать

Ответ №1:

Чтобы получить доступ к обработчику ошибок Observable, вы можете использовать RxJS throwError, чтобы заставить наблюдаемое выполнить выбрасывание. Таким образом, ваш тест может выглядеть примерно так:

 it('rejects when post throws', async () => {
  const param = { id: 10 };
  const errorResponse = new Error('httpService.post error');
  spyOn(httpService, 'post').and.returnValue(throwError(errorResponse));

  await service.getConfiguration(param).catch(err => {
    expect(err).toBe('Subscribe error: httpService.post error');
  });
});
 

Вот Штекблитц, демонстрирующий этот подход.

Кроме того, что касается теста, который вы опубликовали в своем вопросе, если это ваш фактический тестовый код, вы должны знать, что это expect :

 expect(service.getConfiguration).toBeTruthy();
 

всегда будет проходить, потому service.getConfiguration что это функция, поэтому она всегда будет оцениваться как истинная. Вам потребуется вызвать функцию, если вы хотите каким-то образом проверить ее поведение.

Кроме того, я считаю, что эта строка в вашем опубликованном сервисном коде содержит синтаксическую ошибку:

 this.httpService.post('getConfig', params).subscribe{
 

Для этого потребуется открытая скобка после .subscribe , перед открытой фигурной:

 this.httpService.post('getConfig', params).subscribe({
 

но я предполагаю, что это просто ошибка копирования-вставки при построении вашего вопроса.