2012-04-05 17 views
1

sagen, dass ich die folgende Backbone-Router haben:Backbone + Jasmine Test AJAX Erfolg Rückruf in Router

class App.Routers.ThingsRouter extends Backbone.Router 
    initialize: -> new App.Collections.ThingsCollection() 

    index: -> 
    that = this 
    @collection.fetch success: -> 
     view = new App.Views.ThingsIndex(collection: that.collection) 
     $('#app-container').html(view.render().el) 

Ich brauche einen Jasmine Spion zu schreiben, die diese beobachten und sicherstellen, dass App.Views.ThingsIndex() genannt wird. Da es jedoch AJAX ist, wird Folgendes nicht:

describe 'index', -> 
    @router = new App.Routers.ThingsRouter() 
    spyOn(@router.collection, 'fetch') 
    fake = { render: -> '' } 
    @previewsIndexStub = spyOn(Periscope.Views, 'PreviewsIndex').andReturn(fake) 
    @router.index() 
    expect(@previewsIndexStub).toHaveBeenCalled() 

Da Jasmin die Erwartungsfunktion ausgeführt wird, bevor der AJAX-Aufruf abgeschlossen werden kann. Gibt es eine gute Möglichkeit, einen Rückruf so zu testen?

Antwort

1

Verwenden Sie die eingebauten Jasmines waitFor & runs-Methode, um zu warten, bis der Ajax-Aufruf abgeschlossen ist, bevor Sie Ihre expect-Funktion ausführen. Informationen zu diesen beiden Funktionen finden Sie unter Jasmine - Asynchronous specs.

describe 'index', -> 
    @router = new App.Routers.ThingsRouter() 
    spyOn(@router.collection, 'fetch') 
    fake = {}; fake.render = -> ''; 
    @previewsIndexStub = spyOn(Periscope.Views, 'PreviewsIndex').andReturn(fake) 
    @router.index() 
    waitsFor => @previewsIndexStub.wasCalled 
    ### 
    Or if you want to wait for the method to be called more than once 
    use form waitsFor => @previewsIndexStub.callCount > 1 
    ### 
    runs => expect(@previewsIndexStub).toHaveBeenCalled() 
+0

Sie wissen nicht, ob das funktioniert, wie '@ previewsIndexStub' die' toHaveBeenCalled nicht haben() 'Funktion es verfügbar wie' erwarten (@previewsIndexStub) 'tut. Ich bekomme "undefined" ist keine Funktion " – clem

+0

@clem mein Schlechter du willst die Variable' wasCalled' statt –

+1

verwenden Ich machte diese Änderung, wie Sie es aktualisiert, danke! – clem