Ember.js 在qunit中挂起的余烬并发超时

Ember.js 在qunit中挂起的余烬并发超时,ember.js,concurrency,qunit,ember-qunit,ember-concurrency,Ember.js,Concurrency,Qunit,Ember Qunit,Ember Concurrency,在Ember中,我有一个组件,它启动一个永无止境的投票,以保持一些数据的最新状态。像这样: export default Component.extend({ pollTask:任务(函数*(){ while(true){ 产生超时(this.get('pollRate'); this.fetchSomeData(); } }).on('init') }) 这会导致先前存在的验收测试陷入此任务并永远运行,即使它应该异步运行。测试如下所示: test('my test',异步函数(assert)

在Ember中,我有一个组件,它启动一个永无止境的投票,以保持一些数据的最新状态。像这样:

export default Component.extend({
pollTask:任务(函数*(){
while(true){
产生超时(this.get('pollRate');
this.fetchSomeData();
}
}).on('init')
})
这会导致先前存在的验收测试陷入此任务并永远运行,即使它应该异步运行。测试如下所示:

test('my test',异步函数(assert){
mockFindRecord(make('fetched-model'));
等待访问('/mypage');//被卡在这里
等待输入('input','abc123');
assert.ok(somethingboutthepage);
});
起初我认为我模拟了错误的请求,测试只是超时,但事实上它正确地轮询了数据。删除此任务将使验收测试正常完成

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


看到了,但它并没有真正的帮助,因为它只处理单元测试。

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

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

要让它不挂起,最快也是最简单的方法是检查应用程序是否正在测试(gross,我知道):

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

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

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')
window._breakTimerLoopsId = Ember.run.later(() => {
  Ember.run.cancelTimers();
}, 500);