2012-04-07 6 views
1

Ich versuche, die Click-Ereignishandler auf der folgenden Backbone Ansicht spec:Wie testen, ob ein Backbone-Ansichtsereignis ein Objekt zu einer Sammlung hinzufügt?

class ItemView extends Backbone.View 
    events: 
    "click": "addToCurrentlyFocusedList" 

    addToCurrentlyFocusedList: (e) => 
    window.currentlyFocusedList.add @model 

Das ist, was ich habe:

describe "ItemView", -> 
    beforeEach -> 
    @item = new Backbone.Model 
     id: 1 
     name: "Item 1" 
    @view = new ItemView model: @item 

    describe "when clicked", -> 
    it "adds the item to the currently focused list", -> 
     window.currentlyFocusedList = sinon.stub() 
     window.currentlyFocusedList.add = sinon.stub() 
     @view.$el.trigger "click" 
     expect(window.currentlyFocusedList.add).toHaveBeenCalledWith @item 

Dies funktioniert, aber es stört mich aus irgendeinem Grund. Vielleicht fühlt es sich zu sehr an, als würde ich die Implementierung testen.

Eine mögliche Verbesserung, die ich sehen kann, ist die Bewegung der Click-Ereignishandler, die Spezifikation und die currentlyFocusedList in eine neue Ansicht AppView genannt:

describe "AppView", -> 
    beforeEach -> 
    @view = new AppView 

    it "adds a clicked item to the currently focused list", -> 
    $clickedItem = @view.$(".item:first") 
    $clickedItem.trigger "click" 
    expect(@view.currentlyFocusedList.pluck('id')).toInclude $clickedItem.attr('data-id') 

Es ist schön, dass diese beseitigt auch window Verschmutzung. Es testet auch, dass das Objekt wirklich zur Sammlung hinzugefügt wird. Abgesehen davon verschiebt sich der Event-Handler und die Spezifikation in AppView besser als mein erster Ansatz? Gibt es einen besseren Weg?

+0

Subjektive Frage. Dies gehört wahrscheinlich zu http://programmers.stackexchange.com/ oder http://codereview.stackexchange.com/. –

+0

Kühl. Ich wusste nichts von codereview.stackexchange.com. Danke für den Tipp! – Laconical

Antwort

1

Ich würde window.currentlyFocusedList mit einer Dummy-Sammlung auszugeben und testen, dass es dort hinzugefügt wurde. Etwas in dieser Richtung:

beforeEach -> 
    @collection = new Backbone.Collection() 
    spyOn(window, 'currentlyFocusedList').andReturn @collection 

it "adds the item to the collection", -> 
    @view.$el.click() 
    expect(@collection).toInclude @item 

Dieser testet, was Ihr Code tatsächlich tut; Der Code für das Hinzufügen eines Elements zu einer Sammlung wirkt sich auf die Ansicht aus, die an einer anderen Stelle gespeichert ist, und sollte an anderer Stelle getestet werden.

Verwandte Themen