2014-02-25 31 views
5

我使用的是Ember.js Asynchronous Routing指南中描述的功能。也就是说,我从异步路由model钩子返回一个承诺,以便延迟转换到按预期工作的路由。如何使用异步路由完成Ember单元测试?

但是,它打破了单元测试我的应用程序的能力。当我运行测试中,我得到以下错误在控制台:

断言失败:您已经打开的测试模式,禁用 运行循环的自动运行。您将需要包装异步 副作用的任何代码在Ember.run

我裹在Ember.run异步副作用的所有代码,但我仍然得到错误。

这里有一个的jsfiddle一个小例子:http://jsfiddle.net/nRHfv/3/

的例子是基于灰烬入门套件和测试运行它配备。它有一个工作的异步索引路由。如果您在_config对象(第10行)中将testing: false设置为true,它将打开测试套件,并且您应该在控制台中看到上述错误。

我的异步路由的model挂钩位于第38行。我已经尝试了在Ember.run中包装代码的几个变体。例如,我尝试在Ember.run之外定义承诺,完成所有异步内容,然后在外部返回承诺。我也尝试在Ember.run中包装then()的内容,就像我在其他答案中看到的一样(例如ember integration test error. dealing with asynchronous side-effects)。

我在做什么错?

+0

对于查看此错误的人可能想查看关于ember run loop的视频:https://www.youtube.com/watch?v = RLgPBM72LQw – lft93ryt

回答

1

更多的搜索后,我发现this notable commentGuide: Asynchronous side-effects in testing在Ember.js论坛由EmberSherpa

顺便说一句,今天有一个库发布了它的设计,以取代 $ .getJSON是,使这一过程中很容易https://github.com/instructure/ic-ajax

我试过ic-ajax库,它工作!挖,看看它在做什么之后,这里就是我应该写我的异步路由的model钩:

var promise = new Ember.RSVP.Promise(function (resolve, reject) { 
    Ember.$.ajax({ 
    url: '/echo/json/', 
    type: 'POST', 
    data: { 
     json: '{ "text": "Hello from Ember.js" }', 
     delay: 0.25 
    }, 
    dataType: 'json', 
    success: function (response, textStatus, jqXHR) { 
     Ember.run(null, resolve, response); 
    } 
    }) 
}); 

return promise.then(function (response) { 
    return response; 
}); 

我想测试时(但它们对于起动异步路由操作)jQuery的承诺是不Ember.RSVP.Promise互换。

这里有一个更新的jsfiddle异步路由和测试工作:http://jsfiddle.net/nRHfv/5/

我想我会用ic-ajax坚持对清洁代码的缘故,而且由于加载静态固定装置,而不是能力测试时实时API端点。