Вы не делаете ничего плохого, и это обычная ошибка с угасающим параллелизмом. Функция timeout()
в Ember-concurrency использует Ember.run.later()
для создания тайм-аута, и, к счастью или к сожалению, набор тестов Ember знает обо всех таймерах, созданных с помощью Ember.run.later()
, и будет ждать установки всех таймеров, прежде чем позволить тесту продолжиться. Поскольку ваш код использует бесконечный цикл, ваши таймеры никогда не установятся, поэтому тест зависает. В руководствах Ember есть небольшой раздел о тестировании асинхронного кода * здесь .
В документации по ember-concurrency есть раздел об этой конкретной проблеме здесь . Я рекомендую вам просмотреть его, чтобы увидеть их рекомендации о том, как справиться с этим, хотя кажется, что в настоящее время нет действительно элегантного решения.
Самый быстрый и, вероятно, самый простой способ заставить это не зависать, этодобавьте чек, чтобы увидеть, тестируется ли приложение (брутто, я знаю):
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')
Вы также можете попытаться добавить вызов Ember.run.cancelTimers()
в вашем файле tests/helpers/start-app.js
(другое предложениев этом разделе):
window._breakTimerLoopsId = Ember.run.later(() => {
Ember.run.cancelTimers();
}, 500);
Но в документах по API его, похоже, нет, поэтому лично я бы не стал на это полагаться.