Emberjs - 如何测试承诺和其他异步行为?

时间:2014-03-03 23:50:30

标签: javascript asynchronous ember.js integration-testing

遵循教程和其他线程,我无法在使用异步代码时运行测试。以下是我一直在尝试测试的内容:http://emberjs.jsbin.com/xacurasi/1/edit?html,js,output以及入门套件中提供的测试。使用?test参数打开时应用程序窗口(编辑:显示实际应用程序的框架,而不是qunit测试页面)显示空白页面。

这是我唯一的异步代码:

App.IndexRoute = Ember.Route.extend({
    model: function() {
        var promise;

        Ember.run(function() {
            promise = Em.$.getJSON('http://123.345.456.78/ajax/server.php');
        });

        return promise;
    }
});

错误我进入控制台:

Uncaught Error: Assertion Failed: You have turned on testing mode, which disabled the run-loop's autorun. You will need to wrap any code with asynchronous side-effects in an Ember.run

由于我在Ember.run(function() { //my code here});

中包装了异步代码,因此非常混乱

1 个答案:

答案 0 :(得分:4)

编辑:

该错误解决了这个问题。该错误并不意味着对getJSON的调用应该在Ember.run中,这意味着getJSON调用的回调应该在Ember.run中。这是Ember的运行循环如何工作的一个怪癖。该代码在正常操作中工作正常,但不在测试模式下工作。有一个关于它的简短讨论here。您需要做的是提供getJSON函数的回调。这样的事情应该解决它(并明确你正在做什么)。

model: function() {
    return new Ember.RSVP.Promise(function(resolve) {
        Ember.$.getJSON('http://foobar', function(data) {
            Ember.run(null, resolve, data);
        });
    });
}

或者你可以使用我链接到的线程底部的小库。但我认为我只是为了以防万一。只给你一个使用Ember.js的解决方案。