Таймаут параллелизма Ember висит в qunit - PullRequest
0 голосов
/ 23 октября 2019

В 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);
});

Сначала я подумал, что неправильно смоделировал запрос и что тест только что истек, но на самом деле это был правильный опрос данных. Удаление этой задачи завершает приемочный тест в обычном режиме.

Тестирование вручную, кажется, работает нормально, и ничего не застревает. Почему это происходит и как правильно решить эту проблему?

Saw Юнит-тестирование задач на параллельный параллелизм и дает , но это не очень помогает, так как имеет дело только с юнит-тестами.

1 Ответ

1 голос
/ 23 октября 2019

Вы не делаете ничего плохого, и это обычная ошибка с угасающим параллелизмом. Функция 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 его, похоже, нет, поэтому лично я бы не стал на это полагаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...