如何使用异步路由进行 Ember 单元测试?
Posted
技术标签:
【中文标题】如何使用异步路由进行 Ember 单元测试?【英文标题】:How to do Ember unit testing with asynchronous routes? 【发布时间】:2014-03-28 08:18:18 【问题描述】:我正在使用Ember.js Asynchronous Routing 指南中描述的功能。也就是说,我从我的异步路由的model
挂钩返回了一个承诺,以延迟过渡到该路由,这按预期工作。
但是,它破坏了对我的应用进行单元测试的能力。当我运行测试时,控制台中出现以下错误:
断言失败:您打开了测试模式,该模式禁用了 运行循环的自动运行。您将需要使用异步包装任何代码 Ember.run 中的副作用
我已将所有带有异步副作用的代码封装在 Ember.run
中,但我仍然收到错误消息。
这是一个带有最小示例的 JSFiddle:http://jsfiddle.net/nRHfv/3/
该示例基于 Ember Starter Kit 及其随附的测试运行器。它有一个有效的异步索引路由。如果您在 _config
对象(第 10 行)中将 testing: false
设置为 true
,它将打开测试套件,您应该会在控制台中看到上述错误。
我的异步路由的model
钩子在第38 行。我尝试了几种将代码包装在Ember.run
中的变体。例如,我尝试在Ember.run
之外定义承诺,在内部执行所有异步操作,然后在外部返回承诺。我还尝试将then()
的内容包装在Ember.run
中,就像我在其他一些答案中看到的那样(例如ember integration test error. dealing with asynchronous side-effects)。
我做错了什么?
【问题讨论】:
对于看到此错误的人可能想查看有关 ember 运行循环的视频:youtube.com/watch?v=RLgPBM72LQw 【参考方案1】:经过更多搜索,我在EmberSherpa的Ember.js讨论论坛上找到了this notable commentGuide: Asynchronous side-effects in testing:
顺便说一句,今天发布了一个库,旨在取代 $.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 端点。
【讨论】:
以上是关于如何使用异步路由进行 Ember 单元测试?的主要内容,如果未能解决你的问题,请参考以下文章