Ember 访问路由后集成测试挂起
Ember integration testing hangs after visiting route
我正在尝试做一个简单的集成测试,我从 ember-cli 网站上的集成示例开始。现在,当我在浏览器 (localhost:4200/tests) 中进行测试时,以下情况会路由到我期望的位置,但随后它就会挂起,永远不会成功或失败。
import Ember from "ember";
import { test } from 'ember-qunit';
import startApp from '../helpers/start-app';
var App;
module('Integration - Create Event', {
setup: function() {
App = startApp();
},
teardown: function() {
Ember.run(App, App.destroy);
}
});
test('check customers', function() {
visit('/new');
andThen(function() {
fillIn('input#title', 'The Event Name');
ok(true);
// equal(find('.customers input[type="checkbox"]').length, 6, 'Customer checkboxes showing');
});
});
我这里有什么地方做错了吗?或者有其他方法吗?
ember-cli 0.1.5 和 ember 1.9.1
编辑:
ENV.APP.LOG_ACTIVE_GENERATION = true;
ENV.APP.LOG_TRANSITIONS = true;
ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
ENV.APP.LOG_VIEW_LOOKUPS = true;
启用日志显示转换已完成,但 andThen 仍未解决或被拒绝。
编辑:
我想我已经缩小了范围。我有一个时钟服务,我正在将其注入所有控制器,但是当我根本不注入它时,我的测试通过了。我需要时钟服务提供的功能,我怎样才能继续使用它,但让我的集成测试工作?
// services/clock.js
import Ember from 'ember';
export default Ember.Object.extend({
pulse: Ember.computed.oneWay('_seconds').readOnly(),
minutePulse: Ember.computed.oneWay('_minutes').readOnly(),
tick: function () {
var clock = this;
Ember.run.later(function () {
var seconds = clock.get('_seconds');
var minutes = clock.get('_minutes');
if (typeof seconds === 'number') {
clock.set('_seconds', seconds + 1);
if(Math.floor((seconds + 1) / 60) > minutes) {
clock.set('_minutes', minutes + 1);
}
}
}, 1000);
}.observes('_seconds').on('init'),
_seconds: 0,
_minutes: 0
});
可以在 https://github.com/RyanHirsch/ember-test-example 找到示例项目。如果我删除 run.later 测试将通过。
感谢 freenode 上 #emberjs 频道的 teddyz 帮助我解决了这个问题。问题是异步助手 visit()
等待 Ember.run.later()
完成,但我的结构方式是在它完成之前触发另一个 run.later
。所以访问基本上是永远等待。解决方案似乎是使用带有 Ember.run
的 setTimeout。代码如下。
import Ember from 'ember';
export default Ember.Object.extend({
pulse: Ember.computed.oneWay('_seconds').readOnly(),
minutePulse: Ember.computed.oneWay('_minutes').readOnly(),
tick: function () {
var clock = this;
setTimeout(Ember.run.bind(clock, function () {
var seconds = this.get('_seconds');
var minutes = this.get('_minutes');
if (typeof seconds === 'number') {
this.set('_seconds', seconds + 1);
if(Math.floor((seconds + 1) / 60) > minutes) {
this.set('_minutes', minutes + 1);
}
}
}), clock.get('globalSettings.timeout'));
}.observes('_seconds').on('init'),
_seconds: 0,
_minutes: 0
});
我还根据 ember 论坛 (http://discuss.emberjs.com/t/proper-way-to-handler-timers-w-ember-testing/4693/8) 上有关处理计时器和测试的正确方法的讨论创建了一个 globalSettings
对象。这将允许在测试期间调整超时(即将它们设置得非常低以测试功能并仍然保持测试执行速度)
我正在尝试做一个简单的集成测试,我从 ember-cli 网站上的集成示例开始。现在,当我在浏览器 (localhost:4200/tests) 中进行测试时,以下情况会路由到我期望的位置,但随后它就会挂起,永远不会成功或失败。
import Ember from "ember";
import { test } from 'ember-qunit';
import startApp from '../helpers/start-app';
var App;
module('Integration - Create Event', {
setup: function() {
App = startApp();
},
teardown: function() {
Ember.run(App, App.destroy);
}
});
test('check customers', function() {
visit('/new');
andThen(function() {
fillIn('input#title', 'The Event Name');
ok(true);
// equal(find('.customers input[type="checkbox"]').length, 6, 'Customer checkboxes showing');
});
});
我这里有什么地方做错了吗?或者有其他方法吗?
ember-cli 0.1.5 和 ember 1.9.1
编辑:
ENV.APP.LOG_ACTIVE_GENERATION = true;
ENV.APP.LOG_TRANSITIONS = true;
ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
ENV.APP.LOG_VIEW_LOOKUPS = true;
启用日志显示转换已完成,但 andThen 仍未解决或被拒绝。
编辑:
我想我已经缩小了范围。我有一个时钟服务,我正在将其注入所有控制器,但是当我根本不注入它时,我的测试通过了。我需要时钟服务提供的功能,我怎样才能继续使用它,但让我的集成测试工作?
// services/clock.js
import Ember from 'ember';
export default Ember.Object.extend({
pulse: Ember.computed.oneWay('_seconds').readOnly(),
minutePulse: Ember.computed.oneWay('_minutes').readOnly(),
tick: function () {
var clock = this;
Ember.run.later(function () {
var seconds = clock.get('_seconds');
var minutes = clock.get('_minutes');
if (typeof seconds === 'number') {
clock.set('_seconds', seconds + 1);
if(Math.floor((seconds + 1) / 60) > minutes) {
clock.set('_minutes', minutes + 1);
}
}
}, 1000);
}.observes('_seconds').on('init'),
_seconds: 0,
_minutes: 0
});
可以在 https://github.com/RyanHirsch/ember-test-example 找到示例项目。如果我删除 run.later 测试将通过。
感谢 freenode 上 #emberjs 频道的 teddyz 帮助我解决了这个问题。问题是异步助手 visit()
等待 Ember.run.later()
完成,但我的结构方式是在它完成之前触发另一个 run.later
。所以访问基本上是永远等待。解决方案似乎是使用带有 Ember.run
的 setTimeout。代码如下。
import Ember from 'ember';
export default Ember.Object.extend({
pulse: Ember.computed.oneWay('_seconds').readOnly(),
minutePulse: Ember.computed.oneWay('_minutes').readOnly(),
tick: function () {
var clock = this;
setTimeout(Ember.run.bind(clock, function () {
var seconds = this.get('_seconds');
var minutes = this.get('_minutes');
if (typeof seconds === 'number') {
this.set('_seconds', seconds + 1);
if(Math.floor((seconds + 1) / 60) > minutes) {
this.set('_minutes', minutes + 1);
}
}
}), clock.get('globalSettings.timeout'));
}.observes('_seconds').on('init'),
_seconds: 0,
_minutes: 0
});
我还根据 ember 论坛 (http://discuss.emberjs.com/t/proper-way-to-handler-timers-w-ember-testing/4693/8) 上有关处理计时器和测试的正确方法的讨论创建了一个 globalSettings
对象。这将允许在测试期间调整超时(即将它们设置得非常低以测试功能并仍然保持测试执行速度)