[英]How to do Ember unit testing with asynchronous routes?
我正在使用Ember.js異步路由指南中描述的功能。 也就是說,我從異步路由的model
鈎子返回一個promise,以延遲轉換到路由,這可以按預期工作。
但是,它打破了我的應用程序單元測試的能力。 當我運行我的測試時,我在控制台中收到以下錯誤:
斷言失敗:您已打開測試模式,該模式禁用了運行循環的自動運行。 您需要在Ember.run中包含任何帶有異步副作用的代碼
我在Ember.run
包裝了所有帶異步副作用的Ember.run
,但我仍然得到錯誤。
這是一個帶有最小例子的JSFiddle: http : //jsfiddle.net/nRHfv/3/
該示例基於Ember入門套件及其附帶的測試運行器。 它有一個工作的異步索引路由。 如果在_config
對象(第10行)中將testing: false
設置為true
,它將打開測試套件,您應該在控制台中看到上述錯誤。
我的異步路由的model
鈎子在第38行。我已經嘗試了在Ember.run
包裝代碼的幾種變體。 例如,我已經嘗試在Ember.run
之外定義promise,執行所有異步內容,然后在外面返回promise。 我也嘗試在Ember.run
包裝then()
的內容,就像我在其他一些答案上看到的那樣(例如, ember集成測試錯誤。處理異步副作用 )。
我究竟做錯了什么?
更多的搜索后,我發現這個顯着的評論在指南:在測試異步副作用由Ember.js論壇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端點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.