【问题标题】:How to test Promise then method如何测试 Promise then 方法
【发布时间】:2019-08-04 03:29:31
【问题描述】:

如何测试 Promise 的 then() 方法中的代码。我没有看到代码的 then(..) 方法中的代码覆盖率。我的单元测试通过并且没有抛出错误,但是当我查看行覆盖率时, toPromise.then(//this code) 里面的代码没有被覆盖。如何测试该代码。

//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() 的回调,该回调实质上是从 Promise 结果中提取 item1、item2、item3 并返回它们。您可以将该回调提取为另一个函数,并断言它会解构 Promise 结果并返回对象的预期值。
  • 是的,正确,我是否只需将 service.getDataFromAPI 分配给我的单元测试中的 var,然后对其进行断言?
  • 假设您将回调命名为 extractItems,您可以断言如下:`it('应该提取正确的项目', () => { /* 定义你的 mockData 和 expectedResult*/ const result = extractItems (mockData); expect(result).toEqual(expectedResult); })`

标签: angular testing promise


【解决方案1】:

那是因为异步任务。您的测试在承诺之前结束,因此永远不会调用 then 回调。

只需更改您的测试以处理async

方法一

使用 Angular 提供的fakeAsynchttps://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();
}));

方法二

使用 ES2016 中的 async/awaithttps://developer.mozilla.org/en-US/docs/Web/JavaScript/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();
});

【讨论】:

    猜你喜欢
    • 2018-04-02
    • 2014-07-31
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多