Ember测试:您已打开测试模式,该模式禁用了运行循环的自动运行

时间:2015-02-26 16:43:08

标签: ember.js integration-testing ember-cli ember-qunit ember-testing

我正在尝试编写一个简单的Ember集成测试,并继续使用Ember.run来获得令人沮丧的运行循环错误。我有一个噩梦,试图让这个工作,如果有人可以帮助我,我会非常感激。具体来说,我可以看到测试登录并开始加载下一页(应该如此),但是一旦测试完成,我就会收到该错误。这是关于第二次测试,第一次测试(因为我认为没有任何异步)。

import Ember from 'ember';
import startApp from 'jobs-tuftsdaily/tests/helpers/start-app';
import exists from 'jobs-tuftsdaily/tests/helpers/start-app';

var App;

module('Integration - Landing Page', {
    setup: function() {
        App = startApp();
    },
    teardown: function() {
       Ember.run(App, 'destroy');
    }
});

test('Should load content', function() {
  visit('/').then(function() {
    ok(exists("*"), "Found HTML!");
    ok(exists('label:eq(4)'), "Slug label on page");
  });
});

test('Should sign in test user', function() {
  Ember.run(function() {
    visit('/').andThen(function() {
      return fillIn("input[name=email]", "test@test.com");
    }).andThen(function() {
      return fillIn("input[type=password]", "password");
    }).andThen(function() {
      return click("button");
    }).andThen(function() {
      ok(1, "stupid test passed");
    });
  });
});

3 个答案:

答案 0 :(得分:4)

我意识到我迟到了,但无论如何都要去了:

在组件或应用程序代码中的某个地方(也就是说,不在测试代码中),您可能会听到Ember之外的某些事件(例如,DOM事件,通过jQuery或类似的东西),但尝试与之交互它在那个处理程序运行期间。这些处理函数必须包含在Ember.run.bind()中,否则在测试期间不会有runloop。 Ember.run.bind()还会在处理程序中为您设置this

如果你没有在Ember.run.bind()中包装你的事件回调,那么在正常运行应用程序期间,代码可能仍会毫无困难地运行,因为自动运行功能会发现要求运行环境(例如,如果你安排在处理程序中使用Ember.run.schedule()的东西与代码中的Ember交互并为它们启动runloop,但它在测试中关闭了。

答案 1 :(得分:2)

我在组件的集成测试中遇到了同样的问题。错误是:

  

断言失败:您已打开测试模式,禁用了   run-loop的自动运行。

     

您需要在运行中包装任何带有异步副作用的代码。

我找到了集成测试问题的原因。我使用以下代码渲染组件:

let myobject = Ember.Object.create({x:1});
this.set('param', myobject)
this.render(hbs`{{my-object param=param}}`); 

渲染后,如下所示更新myobject会导致错误。:

myobject.set('x',2);

因为它不在ember运行循环中。

而不是这个错误的调用,更新值应该作为以下之一完成:

this.set('param.x',2); 
//OR:
this.set('param', Ember.Object.create({x:1}); 
//OR:
Ember.run(()=>{
    Ember.set(myobject,'x',2);
});

对于您的情况:我没有尝试但我的意见是,异步测试助手,如 visit,click,fillIn 可用于验证测试,而不是在集成测试中,因为以下原因。

答案 2 :(得分:1)

Ember.run中包含您的测试不会有任何帮助,因为测试代码而不是您的应用程序代码,因为您没有收到错误。在您的登录路线中,您必须执行一些异步请求(例如AJAX或setTimeout偶数),并在其处理程序中执行一些Ember API执行(如设置,转换,任何事情)。

如果您需要任何确切的帮助,您需要在路线/控制器中发布您的代码。

我最近发布了一个关于Run Loop的电子书,包括可以downloaded here的自动运行机制。