Ember并发超时挂在qunit中



在Ember中,我有一个组件可以启动一个无休止的轮询,以保持一些数据的最新状态。像这样:

export default Component.extend({
pollTask: task(function * () {
while(true) {
yield timeout(this.get('pollRate'));
this.fetchSomeData();
}
}).on('init')
})

这会导致预先存在的验收测试被困在这个任务中并永远运行,即使它应该异步运行。测试如下:

test('my test', async function(assert) {
mockFindRecord(make('fetched-model'));
await visit('/mypage'); // gets stuck here
await typeIn('input', 'abc123');
assert.ok(somethingAboutThePage);
});

一开始我以为我嘲笑这个请求是错误的,测试只是超时,但事实上它正确地轮询了数据。删除此任务可使验收测试正常完成。

手动测试似乎运行良好,没有任何问题。为什么会发生这种情况,解决这种情况的正确方法是什么?

看到单元测试成员并发任务和产量,但它并没有真正的帮助,因为它只处理单元测试。

您没有做错任何事情,这是ember并发的常见问题。Ember并发的timeout()函数依赖于Ember.run.later()来创建超时,幸运或不幸的是,Ember的测试套件知道使用Ember.run.later()创建的所有计时器,并将等待所有计时器稳定后再继续测试。由于您的代码使用无限循环,因此计时器永远不会稳定,因此测试挂起。在Ember指南中有一个关于测试异步代码的小部分。

在ember并发文档中有一节是关于这个问题的。我建议你浏览一下,看看他们对如何解决这个问题的建议,尽管当时似乎没有真正优雅的解决方案。

让它不挂起的最快也是最简单的方法是检查应用程序是否正在测试(我知道这很恶心(:

pollTask: task(function * () {
while(true) {
yield timeout(this.get('pollRate'));
this.fetchSomeData();
if (Ember.testing) return; // stop polling to prevent tests from hanging
}
}).on('init')

您也可以尝试在tests/helpers/start-app.js文件中调用Ember.run.cancelTimers()(该部分中的另一个建议(:

window._breakTimerLoopsId = Ember.run.later(() => {
Ember.run.cancelTimers();
}, 500);

但它似乎没有出现在API文档中,所以我个人不会依赖它

相关内容

  • 没有找到相关文章

最新更新