Ember.js 余烬验收测试-异步副作用错误

Ember.js 余烬验收测试-异步副作用错误,ember.js,qunit,acceptance-testing,ember-testing,Ember.js,Qunit,Acceptance Testing,Ember Testing,正在尝试在Ember中运行验收测试: test('successful login', (assert) => { Ember.run(() => { visit('/signin'); fillIn('#email', 'validemail@server.com'); fillIn('#password', 'password'); click(':submit'); andThen(function() { asser

正在尝试在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(), '/');
  });
});
您不需要向案例中添加
余烬。运行

根据,您的代码应如下所示:

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运行循环中执行),就会出现此问题

最常见的原因
  • 您直接或通过jQuery将事件处理程序附加到DOM,而没有在Ember.run()中包装与Ember应用程序的交互
  • 直接或使用jQuery执行XHR(异步),而无需在Ember.run()中的回调中包装与Ember应用程序的交互
  • 通用修复 当导致代码执行在runloop(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
            });
        }
    });
    
    最佳做法
  • 使用DOM事件时:
    • 使用组件事件处理()
    • 使用模板操作()
  • 当您想使用AJAX/XHR时,请使用ember AJAX()

  • 最常见的情况是,当您在应用程序中执行的某些操作(异步)没有正确地为Ember进行包装(我所说的包装是指在Ember运行循环中执行)时,就会出现此问题

    最常见的原因
  • 您直接或通过jQuery将事件处理程序附加到DOM,而没有在Ember.run()中包装与Ember应用程序的交互
  • 直接或使用jQuery执行XHR(异步),而无需在Ember.run()中的回调中包装与Ember应用程序的交互
  • 通用修复 当导致代码执行在runloop(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
            });
        }
    });
    
    最佳做法
  • 使用DOM事件时:
    • 使用组件事件处理()
    • 使用模板操作()
  • 当您想使用AJAX/XHR时,请使用ember AJAX()

  • 为什么要在
    Ember.run
    中包装所有内容?这不是必需的,而且可能是问题的原因。为什么要将所有内容都包装在
    Ember.run
    ?这不是必需的,很可能是您的问题的原因。删除
    Ember.run
    会出现相同的错误:`error:Assertion Failed:You have on…`删除
    Ember.run
    会出现相同的错误:`error:Assertion Failed:You have open`