2013-04-03 14 views
5

Mam projekt marionetek, podobny do konfiguracji opisanej w http://www.backbonerails.com/ Używam Rails, Coffeescript i Jasmine/Sinon dla specyfikacji.Testowanie modułów marionetek w izolacji z Jasmine

Mam problemy z testowaniem modułów w izolacji. Jednym z przykładów jest 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 

nie jestem pewien, jak to sprawdzić w oderwaniu od aplikacji (window.MyApp). Chciałbym w zasadzie wyzwolić trasę "# board" i upewnić się, że wywoływana jest showDashboard, bez konieczności udziału w niej całej aplikacji. Używamy potoku zasobów Railsów (więc nie ma RequireJS), więc wszystkie pliki JS są ładowane przy starcie. To, co moim zdaniem działałoby dobrze, to jakoś sfałszować obiekt aplikacji wykorzystywany w tym module, ale jestem otwarty na każde rozwiązanie.

Drugi problem mam podobnie testuje Marionette poleceń i reqres, na przykład w widoku mam

App.execute("navigate:root") 

Znowu problemem jest to, że nie chcę mieć prawdziwą aplikację wziąć udział w spec, chcę np zrób nową Marionetkę. Zastosuj tylko dla spec. Widok jest w module, który jest zdefiniowany w taki sam sposób, jak pokazano w pierwszym przykładzie kodu.

Zasadniczo chcę uniknąć używania prawdziwej aplikacji w specyfikacjach i użyć albo makiety albo (prawdopodobnie lepiej/łatwiej) tylko nowej marionetki. Aplikacja. Byłoby to dla mnie użyteczne we wszystkich przypadkach, gdy rzeczy przechodzą przez obiekt aplikacji, na przykład rzeczy w Wreqr, inicjalizatory dla routerów itp.

Odpowiedz

4

Powinieneś zamknąć się w grze sinonJs.

Pierwszy test powinien utworzyć instancję routera, a następnie zamknąć metodę Showbaseboard kontrolera.

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

i test, który był nazywany

expect(@showDashboardStub).toHaveBeenCalled() 

Drugi test zależy, czy chcesz, aby polecenia są wywoływane do wykonania lub polecenia są obsługiwane przetestować. W pierwszym przypadku należy utworzyć instancję executora i wywołać App.execute, w drugim przypadku należy utworzyć instancję klasy, która obsługuje polecenie i wywołać App.execute.