未处理的承诺拒绝:错误:注入器已被销毁

在最近关闭的这个问题中: https://github.com/angular/angular/issues/44186

贡献者 (@jessicajaniuk) says

我们相信这可以通过 destroyAfterEach: true 解决。如果您看到需要 destroyAfterEach: false 的故障,则很可能您的测试中存在范围泄漏。如果您继续看到原始问题,请为其打开一个新问题。

我想知道是否有人可以详细说明或建议如何识别“范围蔓延”的策略

在使用 destroyAfterEach: true 升级到 Angular 13 后,我也遇到了这个问题

stack overflow Unhandled promise rejection: Error: Injector has already been destroyed
原文答案

答案:

作者头像

使用 PrimeNG 作为组件库,我在使用任何类型的覆盖或弹出窗口(例如对话框、日历)的组件测试中遇到了这个问题。只需在 fakeAsync 区域中运行这些测试即可修复它。

我想这与未决动画有关,但我的第一次尝试 - 在测试设置中使用 NoopAnimationsModule - 没有帮助。

作者头像

@user11883568 的回答让我朝着正确的方向前进,但使用 fakeAsync 对我的情况没有帮助。相反,我所做的是通过添加 here 所述的以下内容来选择退出受此问题影响的单元测试的拆卸:

对于完整套件,在现有的 TestBed.configureTestingModule 上,只需添加以下行:

beforeEach(async () => {
    await TestBed.configureTestingModule({
        imports: [...],
        declarations: [...],
        providers: [...],
        teardown: {destroyAfterEach: false}   // <- add this line
    }).compileComponents();
});

或者,如果问题仅出现在某些测试中,您可以选择退出描述块:

beforeAll(() => {
    // Deactivate teardown for these tests because of a problem with
    // the primeNg dialog.
    TestBed.resetTestEnvironment();
    TestBed.initTestEnvironment(
        BrowserDynamicTestingModule,
        platformBrowserDynamicTesting(),
        {teardown: {destroyAfterEach: false}}
    );
});

相关问题