6

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

3 回答 3

4

我意识到我参加聚会迟到了,但无论如何:

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

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

于 2015-11-19T14:51:53.987 回答
2

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

断言失败:您打开了测试模式,这禁用了运行循环的自动运行。

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

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

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);
});

对于您的情况:我没有尝试过,但我的观点是,访问、单击、填充等异步测试助手可以用于验收测试而不是集成测试,原因如下。

于 2016-04-28T07:29:56.377 回答
1

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

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

我最近出版了一本关于 Run Loop 的电子书,包括可以在这里下载的自动运行机制。

于 2015-09-16T12:17:06.713 回答