我正在使用Ember.js Asynchronous Routing指南中描述的功能。也就是说,我从异步路由的model
挂钩返回一个promise,以延迟转换到路由,这可以按预期工作。
然而,它打破了我的应用程序单元测试的能力。当我运行我的测试时,我在控制台中收到以下错误:
断言失败:您已打开测试模式,禁用了 run-loop的自动运行。您将需要使用异步包装任何代码 Ember.run中的副作用
我在Ember.run
中包含了所有带异步副作用的代码,但我仍然得到错误。
这是一个带有最小例子的JSFiddle: http://jsfiddle.net/nRHfv/3/
该示例基于Ember入门套件及其附带的测试运行器。它有一个工作的异步索引路由。如果您在testing: false
对象(第10行)中将true
设置为_config
,它将打开测试套件,您应该会在控制台中看到上述错误。
我的异步路由的model
挂钩位于第38行。我已经尝试了在Ember.run
中包装代码的几种变体。例如,我尝试在Ember.run
之外定义promise,执行所有异步内容,然后在外面返回promise。我还尝试在then()
中包含Ember.run
的内容,就像我在其他一些答案中看到的那样(例如ember integration test error. dealing with asynchronous side-effects)。
我做错了什么?
答案 0 :(得分:1)
经过更多搜索后,我在this notable comment的Ember.js论坛上的Guide: Asynchronous side-effects in testing上找到了EmberSherpa:
BTW,今天发布了一个旨在取代的图书馆 $ .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 promises在测试时不能与Ember.RSVP.Promise
互换(但它们用于触发异步路由操作)。
这是一个更新的JSFiddle,具有异步路由和测试功能: http://jsfiddle.net/nRHfv/5/
我认为为了更清晰的代码,我会坚持使用ic-ajax,并且因为在测试时能够加载静态装置而不是实时API端点。