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

Angular单元测试出现Error: Uncaught (in promise): true错误的排查与修复求助

解决Angular单元测试中Error: Uncaught (in promise): true的问题

首先,我们来拆解这个报错:Uncaught (in promise): true意味着有一个Promise被拒绝(reject)了,而且拒绝的值是true。结合你的代码来看,问题大概率出在服务Stub的配置和组件异步逻辑的处理上,下面一步步来修复:

1. 修正checkRequiredRoles的Stub实现

你的实际服务方法checkIfCurrentUserHasRequiredRoles是同步返回布尔值的,但当前Stub里返回的是{},这会导致组件中this.hasAdminRole被赋值为一个空对象,而非预期的布尔值。如果组件后续逻辑依赖这个布尔值做判断,很可能会触发未捕获的错误(甚至意外生成Promise)。

把Stub改成同步返回布尔值:

const masterService = {
    loadTranslationConfiguration(): any {
        // 这里要返回符合测试期望的数据,否则dataConfig的断言会失败
        return of({
            industries: new Array(3), // 生成3个元素的数组匹配你的断言
            fonts: new Array(2)       // 生成2个元素的数组匹配你的断言
        });
    },
    // 同步返回布尔值,比如true,根据你的测试场景调整
    checkRequiredRoles: (requiredRoles, arg) => true,
    saveTag(): any {
        return of(saveTags);
    },
};

2. 确保loadTranslationConfiguration返回正确数据

你的测试断言component.dataConfig.industries.length为3、fonts.length为2,但当前Stub返回的是空对象{},这会导致组件无法正确初始化dataConfig,进而可能在后续逻辑中抛出错误(甚至衍生出未处理的Promise)。上面的代码已经修正了这一点,返回包含对应数组的对象。

3. 排查未捕获的Promise来源

报错里的rejection: true说明某个Promise被拒绝了,你可以做以下检查:

  • 查看ngOnInit的完整代码:是否有其他异步操作(比如调用服务返回Promise、使用async/await)但未添加错误捕获?如果有,记得添加.catch()或者try/catch处理错误。
  • 确认服务Stub的所有方法:是否有其他方法返回了被拒绝的Promise?比如如果某个服务方法在实际代码中返回Promise,但Stub没正确处理,就可能导致这个报错。

4. 优化测试的异步处理

你的测试使用了fakeAsync和tick(),这没问题,但要确保:

  • 手动调用component.ngOnInit()后,tick()能覆盖所有异步操作(比如Observable的订阅、Promise的完成)。
  • 如果组件的ngOnInit依赖fixture.detectChanges()触发的变更检测(通常Angular会在第一次detectChanges时调用ngOnInit),可以取消注释fixture.detectChanges(),而不是手动调用component.ngOnInit(),这样更贴近真实场景:
it('ngOnInit', fakeAsync(() => {
    fixture.detectChanges(); // 触发ngOnInit
    tick();
    expect(component.dataConfig.industries.length).toEqual(3);
    expect(component.dataConfig.fonts.length).toEqual(2);
}));

按照上面的步骤调整后,应该能解决这个报错和测试断言失败的问题。

内容的提问来源于stack exchange,提问作者Swarup Chavan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:22:32