Ember验收测试-异步副作用错误



尝试在Ember:中运行验收测试

test('successful login', (assert) => {
Ember.run(() => {
visit('/signin');
fillIn('#email', 'validemail@server.com');
fillIn('#password', 'password');
click(':submit');
andThen(function() {
assert.equal(currentURL(), '/');
});
});
});

偶尔(似乎是随机的)会产生错误:

"全局错误:错误:断言失败:您已打开测试模式,该模式禁用了运行循环的自动运行。您需要在运行中包装任何具有异步副作用的代码…">

我能够得到一个工作版本:

test('successful login', (assert) => {
const done = assert.async();
Ember.run(() => {
visit('/signin').then(() => {
fillIn('#email', 'isaac@silverorange.com').then(() => {
fillIn('#password', 'keen').then(() => {
click(':submit').then(() => {
assert.equal(currentURL(), '/');
done();
});
});
});
});
});
});

然而,如果我包含使用相同路径的第二个测试(对于不成功的登录),其中一个测试几乎总是以上面列出的错误告终。

我想知道我对运行循环Ember.run以及如何使用异步行为进行测试有什么不了解的地方。如有任何帮助或建议,我们将不胜感激!

根据指南,您的代码应该是这样的:

test('successful login', (assert) => {
visit('/signin');
fillIn('#email', 'validemail@server.com');
fillIn('#password', 'password');
click(':submit');
andThen(function() {
assert.equal(currentURL(), '/');
});
});

您不需要在案例中添加Ember.run

最常见的情况是,当你在应用程序中(异步)做一些没有为Ember正确包装的事情时(我所说的包装是指在Ember运行循环中执行),就会出现这个问题。

最常见的原因

  1. 您直接或使用jQuery将事件处理程序附加到DOM,而无需在Ember.run()中包装与Ember应用程序的交互
  2. 您直接或使用jQuery执行了XHR(异步),而没有在Ember.run()中的回调中包装与Ember应用程序的交互

常规修复

当您在运行循环(XHR回调或事件处理程序)之外执行与应用程序交互的代码时,请使用Ember.run().包装该代码

事件:

Ember.$('div').on('mouseover',function() {
Ember.run(function() {
// Interaction with application
});
});

XHR/Ajax:

Ember.$.ajax({
success: function() {
Ember.run(function() {
// Interaction with application
});
}
});

最佳实践

  1. 使用DOM事件时:
    • 使用组件事件处理(https://guides.emberjs.com/v2.11.0/components/handling-events/)
    • 使用模板操作(https://guides.emberjs.com/v2.11.0/templates/actions/)
  2. 当你想做AJAX/XHR使用emberAjax(https://github.com/ember-cli/ember-ajax)