【发布时间】: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); })`