#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. Нужно ли мне передавать здесь фактические аргументы? Если да, то как это сделать здесь?