如何测试承诺的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();
});