1

尝试在 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 以及如何使用异步行为进行测试有什么不了解的地方。任何对良好资源的帮助或指示将不胜感激!

4

2 回答 2

0

最常见的情况是,当您在应用程序中(异步)执行某些未为 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/阿贾克斯:

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

最佳实践

  1. 处理 DOM 事件时:
  2. 当您想做 AJAX/XHR 时,请使用 ember-ajax ( https://github.com/ember-cli/ember-ajax )
于 2017-02-15T13:01:10.350 回答
0

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

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

  andThen(function() {
    assert.equal(currentURL(), '/');
  });
});

您不需要Ember.run在您的案例中添加一个。

于 2017-01-19T05:53:38.073 回答