如何测试承诺然后方法



如何测试承诺的then((方法中的代码。我看不到我代码的当时(..(方法中代码的代码覆盖范围。我的单元测试通过并没有丢任何错误,但是当我查看行覆盖范围时,topromise内部的代码。我如何测试该代码。

//service file
getDataFromAPI(num: string): Promise<Model> {
  return this._http
   .get<Model>('url')
   .toPromise()
   .then(resolve => {
       const { item1, item2, item3 } = resolve;
       return { item1, item2, item3 };
  });
}

//unit test
describe('getDataFromAPI', () => {
it('should get data', () => {
  const service: Service = TestBed.get(Service);
  const httpClientGetSpy = jest.spyOn(httpClient, 'get');
  service.getDataFromAPI(num).then(response => {
    expect(response.item1).toEqual('one');
    expect(response.item2).toEqual('two');
    expect(response.item3).toEqual('three');
  });
  expect(httpClientGetSpy).toHaveBeenCalled();
});
});

这是由于异步任务。您的测试结束前承诺,因此then回调从未被调用。

只需更改测试以处理async

方法1

使用Angular提供的fakeAsync:https://angular.io/api/core/testing/fakeasync

it('should get data', fakeAsync(() => {
  const service: Service = TestBed.get(Service);
  const httpClientGetSpy = jest.spyOn(httpClient, 'get');
  service.getDataFromAPI(num).then(response => {
    expect(response.item1).toEqual('one');
    expect(response.item2).toEqual('two');
    expect(response.item3).toEqual('three');
  });
  expect(httpClientGetSpy).toHaveBeenCalled();
}));

方法2

使用ES2016的async/await:https://developer.mozilla.org/en-us/docs/web/javascript/reference/reference/operators/await

it('should get data', async() => {
  const service: Service = TestBed.get(Service);
  const httpClientGetSpy = jest.spyOn(httpClient, 'get');
  let response = await service.getDataFromAPI(num);
  expect(response.item1).toEqual('one');
  expect(response.item2).toEqual('two');
  expect(response.item3).toEqual('three');
  expect(httpClientGetSpy).toHaveBeenCalled();
});

方法3

处理何时应以done功能结束测试:

it('should get data', (done) => {
  const service: Service = TestBed.get(Service);
  const httpClientGetSpy = jest.spyOn(httpClient, 'get');
  service.getDataFromAPI(num).then(response => {
    expect(response.item1).toEqual('one');
    expect(response.item2).toEqual('two');
    expect(response.item3).toEqual('three');
    done();
  });
  expect(httpClientGetSpy).toHaveBeenCalled();
});

最新更新