如何对返回 Angular 承诺的函数进行单元测试

knb*_*bin 3 promise jasmine karma-jasmine angular

我在组件中有一个函数,它将调用带有 3 个参数的服务方法,并返回一个承诺。我想在角度中使用 karma jasmine 对函数进行单元测试。我在这里犯了什么错误吗?

组件代码

getHeaderData() {
 return this.service.getList({
    id: this.id,
    name: this.name,
    pageName: constants.PAGE_NAME
  });
}
Run Code Online (Sandbox Code Playgroud)

服务代码

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);      
    }
 });
}
Run Code Online (Sandbox Code Playgroud)

规格文件代码

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);
});
Run Code Online (Sandbox Code Playgroud)

服务的实际返回值是一个对象数组,与我在常量文件中创建的对象数组相同作为响应,并且使用上面的代码我得到以下错误。我不确定这是正确的方法。

类型参数缺少 ' { then 中的以下属性: ExpectedRecursive<{< TResult1 等......

Yev*_*kov 8

一切看起来都不错,您只是错过了await关键字,因为您返回了Promiseof 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);
});
Run Code Online (Sandbox Code Playgroud)