Ember Octane:控制器上的单元测试异步操作
Ember Octane: Unit testing async action on controller
具有以下控制器和测试:
app/controllers/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;
}
}
tests/unit/controllers/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 方式是什么?
不知道为什么很难找到这些信息,可能是 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);
});
如果有人提出更 ember 的答案,我会接受一次
这里的诀窍是不要使用send
!通常我会使用 send
only 如果你需要在路由链中冒泡动作。这是一个有点老的概念,它 没有 return 值 。所以 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);
});
具有以下控制器和测试:
app/controllers/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;
}
}
tests/unit/controllers/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 方式是什么?
不知道为什么很难找到这些信息,可能是 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);
});
如果有人提出更 ember 的答案,我会接受一次
这里的诀窍是不要使用send
!通常我会使用 send
only 如果你需要在路由链中冒泡动作。这是一个有点老的概念,它 没有 return 值 。所以 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);
});