Как модульно протестировать функцию, которая возвращает обещание в angular

#angular #promise #jasmine #karma-jasmine

Вопрос:

У меня есть функция внутри компонента, которая вызовет метод службы с 3 аргументами и вернет обещание. Я хочу модульно протестировать функцию, используя karma jasmine в angular. Допустил ли я здесь какие-нибудь ошибки?

код компонента

 getHeaderData() {
 return this.service.getList({
    id: this.id,
    name: this.name,
    pageName: constants.PAGE_NAME
  });
}
 

сервисный код

 getList(param): Promise<any> {
 const params = new HttpParams()
    .set('cId',param.id)
    .set('cName',param.name)
    .set('cPageName',param.pageName);
  return new Promise((resolve, reject) => {
   try {
       this.httpService.get('getHeader', {params}).subscribe(data => {
         resolve(data);
        });
   }catch (err){
     reject(err);      
    }
 });
}
 

код файла спецификации

 it('test getHeaderData()', async () => {
  const serviceSpy: Service = TestBed.get(Service);
  SpyOn(serviceSpy, 'getList').and.ReturnValue(Promise.resolve(constants.response));
  expect(serviceSpy.getList).toHaveBeenCalled();
  expect(component.getHeaderData()).toBe(constants.response);
});
 

фактическое возвращаемое значение сервиса представляет собой массив объектов, которые я создал в файле констант в качестве ответа, и с приведенным выше кодом я получаю ошибку ниже. Я не уверен, что это правильный способ сделать это.

Аргумент типа отсутствует, следующие свойства образуют ‘ { тогда: Ожидаемый повторный< TResult1 и т. д……

Ответ №1:

Все выглядит хорошо, вы просто пропустили await ключевое слово, потому что возвращаете Promise значение constants.response ( Promise<constants.response> ). Следовательно, вы должны await это сделать перед проверкой.

 it('test getHeaderData()', async () => {
  const serviceSpy: Service = TestBed.get(Service);
  SpyOn(serviceSpy, 'getList').and.ReturnValue(Promise.resolve(constants.response));
  expect(serviceSpy.getList).toHaveBeenCalled();

  // Added missed `await` keyword
  expect(await component.getHeaderData()).toBe(constants.response);
});
 

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

1. Я добавил ожидание, как вы упомянули, но теперь я получаю следующие две ошибки 1. Ожидаемый список получения шпиона должен быть заблокирован 2. не удается прочитать свойство «идентификатор» null. Нужно ли мне передавать здесь фактические аргументы? Если да, то как это сделать здесь?