2013-04-03 129 views
5

我有一個Marionette項目,類似於http://www.backbonerails.com/ 中描述的設置。我正在使用Rails,Coffeescript和Jasmine/Sinon來查看規格。與Jasmine隔離測試Marionette模塊

我在單獨測試模塊時遇到問題。一個例子是路由器:

@MyApp.module "DashboardApp", (DashboardApp, App, Backbone, Marionette, $, _) -> 

    class DashboardApp.Router extends Marionette.AppRouter 
    appRoutes: 
     "dashboard" : "showDashboard" 

    API = 
    showDashboard: -> 
     DashboardApp.Show.Controller.showDashboard() 

    App.addInitializer -> 
    new DashboardApp.Router 
     controller: API 

我不知道如何從App(window.MyApp)隔離測試這個。我想基本上觸發「#dashboard」路由並聲明showDashboard被調用,而不必讓整個應用程序參與。我們使用Rails資產管道(因此不需要RequireJS),因此所有JS文件都在開始時加載。我認爲可以正常工作的是以某種方式模擬此模塊中使用的App對象,但我對任何解決方案都是開放的。

我也有類似的正在測試木偶另一個問題命令和reqres,例如在視圖中我有

App.execute("navigate:root") 

同樣的問題是,我不希望有實際應用參與規格,我想例如根據規格製作新的Marionette.Application。該視圖位於與第一個代碼示例中顯示的方式相同的模塊中。

基本上我想避免在規範中使用真正的應用程序,並使用模擬或(可能更好/更容易)只是一個新的Marionette.Application。所以這對我來說在所有通過應用程序對象的情況下都很有用,例如Wreqr的東西,路由器的初始值設定程序等。

回答

4

您應該與sinonJs一起存根。

首先測試應該實例化路由器,然後存根Controller showDashboard方法。

@router = new App.DashboardApp.Router 
@showDashboardStub = sinon.stub @router.controller, 'showDashboard' 
@router.navigate "dashboard", {trigger: true} 

和測試,它被稱爲

expect(@showDashboardStub).toHaveBeenCalled() 

第二次測試,如果你想測試命令被調用執行或正在處理的命令依賴。第一種情況是您實例化執行程序和存根App.execute,第二種情況是您實例化處理該命令並調用App.execute的類。