Angular 2 Promise单元测试问题:如何等待Promise返回结果
解决Angular测试中Promise异步回调的等待问题
首先得指出你代码里的一个关键问题:你的服务桩中创建Promise的方式是错误的,当前的new Promise(() => 'test')没有调用resolve方法,这个Promise会一直处于pending状态,永远不会触发then回调。你需要改成正确的resolve形式:
const testService = { testMethod: jasmine.createSpy('testMethod').and.returnValue(Promise.resolve('test')) }; // 或者用构造函数写法: // .and.callFake(() => new Promise(resolve => resolve('test')))
接下来解决测试中等待Promise完成的问题,针对Angular测试场景,有两种常用方案:
方案1:使用async/await语法
直接把测试用例的回调函数改成async,然后等待Promise执行完成。因为testMethod返回的是Promise,你可以直接await它,或者通过Promise.resolve()等待微任务队列清空:
it('test example', async () => { // 准备 const response = 'test'; component.selected = undefined; // 执行 component['myMethod'](); // 等待Promise的then回调执行完成 await testService.testMethod(); // 或者更通用的方式,不依赖spy的返回: // await Promise.resolve(); // 断言 expect(component.selected).toEqual(response); });
方案2:使用fakeAsync + flushMicrotasks
如果你习惯用fakeAsync(之前处理Observable的方式),可以用flushMicrotasks()来执行所有待处理的微任务(包括Promise的回调):
it('test example', fakeAsync(() => { // 准备 const response = 'test'; component.selected = undefined; // 执行 component['myMethod'](); // 触发所有微任务,执行Promise的then回调 flushMicrotasks(); // 断言 expect(component.selected).toEqual(response); }));
两种方案都能解决你的问题,你可以根据自己的习惯选择:如果更熟悉Promise的异步语法,选async/await;如果想保持和Observable测试一致的fakeAsync风格,选第二种方案。
内容的提问来源于stack exchange,提问作者AngularM
相关产品推荐
相关产品推荐

