Ember Octane: модульное тестирование asyn c действие на контроллере - PullRequest
1 голос
/ 23 января 2020

Наличие следующих контроллеров и тестов:

приложение / контроллеры / приложение. js

import Controller from '@ember/controller';
import { action } from '@ember/object';

export default class ApplicationController extends Controller {
  flag = false;

  @action
  raiseFlag() {
    this.flag = true;
  }

  @action
  async raiseFlagAsync() {
    await new Promise(resolve => setTimeout(resolve, 1000));
    this.flag = true;
  }
}

тесты / устройство / контроллеры / приложение-тест. js

import { module, test } from 'qunit';
import { setupTest } from 'ember-qunit';

module('Unit | Controller | application', function(hooks) {
  setupTest(hooks);

  test('it raises flag', function(assert) {
    let controller = this.owner.lookup('controller:application');
    assert.equal(controller.flag, false);
    controller.send('raiseFlag');
    assert.equal(controller.flag, true);
  });

  test('it raises flag asyncronously', async function(assert) {
    let controller = this.owner.lookup('controller:application');
    assert.equal(controller.flag, false);
    await controller.send('raiseFlagAsync');
    assert.equal(controller.flag, true);
  });
});

Первый тестовый пример пройден. Второй тест не пройден (асин c один)

Что такое угольно-октановый способ ожидания асин c действия?

Ответы [ 2 ]

1 голос
/ 23 января 2020

Хитрость в том, чтобы не использовать send! Как правило, я бы использовал send только , если вам нужно вспомнить действия в цепочке маршрутов. Это немного старая концепция, и у нее нет возвращаемого значения . Так что await controller.send будет не работать.

Вы должны просто вызвать действие напрямую:

test('it raises flag asyncronously', async function(assert) {
  let controller = this.owner.lookup('controller:application');
  assert.equal(controller.flag, false);
  await controller.raiseFlagAsync();
  assert.equal(controller.flag, true);
});
0 голосов
/ 23 января 2020

Не уверен, почему было так сложно найти эту информацию, может быть, плохой SEO.

import { waitUntil } from '@ember/test-helpers';

test('it raises flag asyncronously', async function(assert) {
  let controller = this.owner.lookup('controller:application');
  assert.equal(controller.flag, false);
  controller.send('raiseFlagAsync');

  await waitUntil(() => controller.flag === true);
});

Если кто-нибудь придет с более тёмным ответом, я просто приму это один раз

...