【问题标题】:Ember testing: You have turned on testing mode, which disabled the run-loop's autorunEmber 测试:您已打开测试模式,这禁用了运行循环的自动运行
【发布时间】:2015-04-29 03:43:29
【问题描述】:

我正在尝试编写一个简单的 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");
    });
  });
});

【问题讨论】:

  • 这个应用程序的生产代码(测试中)是什么样的?我的猜测是一些异步代码正在抛出这个,但很难说出更多细节
  • 我遇到了同样的问题,但仅限于 Firefox,而不是 chrome。没有测试过幻影或野生动物园或ie
  • 您找到解决方案了吗?我也有同样的问题。。

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


【解决方案1】:

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

断言失败:您打开了测试模式,这禁用了 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)可以用于验收测试而不是集成测试,原因如下。

【讨论】:

  • myobject.set('x', 2); vs. this.set('param.x', 2); 帮助了我,谢谢!
【解决方案2】:

我意识到我参加聚会迟到了,但还是这样:

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

如果您不将事件回调包装在 Ember.run.bind() 中,则代码可能在应用程序的正常运行期间仍能轻松运行,因为自动运行功能会发现运行循环要求很高(例如,如果您使用Ember.run.schedule() 在处理程序期间)与代码中的 Ember 交互并为它们启动一个运行循环,但它在测试中被关闭。

【讨论】:

    【解决方案3】:

    将您的测试包装在Ember.run 中将无济于事,因为您遇到的错误不是因为测试代码而是您的应用程序代码而发生的。在您的登录路由中,您必须执行一些异步请求(例如 AJAX 或 setTimeout 甚至),并且在它们的处理程序中您执行一些 Ember API 执行(例如设置、转换等)。

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

    我最近出版了一本关于 Run Loop 的电子书,包括自动运行机制,可以是 downloaded here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 2013-06-30
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多