余烬集成测试在访问路由后挂起



我正在尝试做一个简单的集成测试,我从 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');
    });
});

我在这里做错了什么吗?还是有其他方法可以做到这一点?

余烬-CLI 0.1.5 和余烬 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 找到一个示例项目。如果我删除运行,稍后测试将通过。

感谢 freenode 上 #emberjs 频道中的 teddyz 帮助我解决这个问题。问题是异步帮助程序visit()等待Ember.run.later()完成,但是我构建它的方式,在它完成之前它会触发另一个run.later。所以访问基本上是永远等待。解决方案似乎是将 setTimeout 与 Ember.run 一起使用。代码如下。

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 对象。这将允许在测试期间调整超时(即将它们设置为非常低以测试功能并仍然保持测试执行速度)

最新更新