You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:26:49