2014-02-25 29 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端點。