2013-04-03 9 views
5

Ho un progetto Marionette, simile alla configurazione descritta in http://www.backbonerails.com/ Sto usando Rails, Coffeescript e Jasmine/Sinon per le specifiche.Test dei moduli Marionette in isolamento con Jasmine

Ho problemi durante il test dei moduli in isolamento. Un esempio è il router:

@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 

Non sono sicuro di come testare questo in isolamento da App (window.MyApp). Vorrei fondamentalmente attivare la route "#dashboard" e affermare che showDashboard viene chiamato, senza dover lasciare che l'intera applicazione partecipi a questo. Stiamo utilizzando la pipeline delle risorse di Rails (quindi nessun RequireJS), quindi tutti i file JS vengono caricati all'avvio. Quello che penso funzionerebbe bene è in qualche modo prendere in giro l'oggetto App usato in questo modulo, ma sono aperto a qualsiasi soluzione.

L'altro problema che ho simile sta testando Marionette comandi e reqres, ad esempio, in una vista devo

App.execute("navigate:root") 

Anche in questo caso il problema è che io non voglio avere l'applicazione reale partecipare alla spec, voglio ad es crea una nuova Marionetta.Applicazione solo per le specifiche. La vista è in un modulo che è definito nello stesso modo mostrato nel primo esempio di codice.

Fondamentalmente voglio evitare di utilizzare l'applicazione reale in specifiche, e utilizzare un modello o (probabilmente migliore/più facile) solo una nuova Marionette.Application. Quindi questo sarebbe utile per me in tutti i casi in cui le cose vanno attraverso l'oggetto applicazione, ad esempio Wreqr roba, inizializzatori per i router ecc

risposta

4

Si dovrebbe stub con sinonJs.

Primo test dovrebbe istanziare il router e quindi stub il metodo di controllo showDashboard.

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

e il test che è stato chiamato

expect(@showDashboardStub).toHaveBeenCalled() 

La seconda prova dipende se si vuole testare il comando di essere chiamato per l'esecuzione o il comando manipolato. Primo caso istanziate l'esecutore e lo stub App.execute, il secondo caso istanzia la classe che gestisce il comando e chiama App.execute.