2

具有以下控制器和测试:

应用程序/控制器/application.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;
  }
}

测试/单元/控制器/application-test.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);
  });
});

第一个测试用例通过。第二个测试用例失败(异步一个)

等待异步操作的 ember-octane 方式是什么?

4

2 回答 2

2

这里的诀窍是不要使用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);
});
于 2020-01-23T16:20:26.097 回答
0

不知道为什么很难找到这些信息,也许是糟糕的 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);
});

如果有人想出一个更灰烬的答案,我会接受一次

于 2020-01-23T15:09:04.487 回答