【问题标题】:Angular Karma: await fixture.whenStable always times out after upgrade from Angular v8 to v12Angular Karma:从 Angular v8 升级到 v12 后 await fixture.whenStable 总是超时
【发布时间】:2021-06-18 02:17:12
【问题描述】:

我对使用响应式表单的组件进行了一些单元测试。

在测试中,我将修补表单上的值,然后单元测试将测试我对各种表单valueChanges 订阅的期望。

为了让测试等待valueChanges 执行,我总是在patch 之后使用以下内容:

fixture.detectChanges();
await fixture.whenStable();

这总是很好。

在我升级(从 v8 到 v12)之后,当我拥有 await fixture.whenStable() 时,所有测试都会超时。

我明白了:

    Error: Timeout - Async function did not complete within 5000ms (set by jasmine.DEFAULT_TIMEOUT_INTERVAL)
    error properties: Object({ originalStack: 'Error: Timeout - Async function did not complete within 5000ms (set by jasmine.DEFAULT_TIMEOUT_INTERVAL)
            at new ZoneAwareError (http://localhost:9877/_karma_webpack_/webpack:/node_modules/zone.js/fesm2015/zone-error.js:92:33)

当然,如果我删除 await fixture.whenStable();,测试将不再有效,因为当我尝试访问属性集时,valueChanges 的形式未设置。

为什么await fixture.whenStable() 现在似乎挂了?

【问题讨论】:

  • 您是否尝试过使用waitForAsyncfakeAsynctick?我怀疑他们能否解决您的问题,但也许值得一试。
  • 感谢您的建议。我尝试了每种组合,但它只是不等待或在没有 await fixture.whenStable() 的情况下触发 valueChanges。

标签: angular karma-jasmine


【解决方案1】:

今天回到这个问题,我想我发现了问题(就我而言)。

我在组件ngAfterViewInit() 中有一个setTimeout,它没有被清除。事实上,setTimeout 是一个错误,它只需要关闭一次,所以应该是setInterval。我确实对ngAfterViewInit 有一些问题,所以我已经遇到了

spyOn(component, 'ngAfterViewInit').and.callFake(() => { });

因为计时器中的代码并不那么重要(只是打开/关闭动画),所以仍然不能 100% 确定为什么真正的 ngAfterViewInit 的变化会有所不同......但它确实如此,我的 @ 987654327@ 不再挂起,测试现在等待表单valueChanges

【讨论】:

    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2023-03-18
    • 1970-01-01
    • 2019-10-26
    • 2019-12-03
    • 1970-01-01
    相关资源
    最近更新 更多