2017-01-09 3 views
1

Ich habe eine Ansicht mit submit Methode. Wie schreibe ich einen Komponententest zu prüfen, ob das Ereignis in dem folgenden Code ausgelöst wirdUnit-Test Backbone-Modell speichern Griff

submit:(event) -> 
    MyModel.save(null, { 
     success: (model, response)=> 
      @trigger('saveSuccess', response) 
    }) 

Anmerkung: Ich will nicht, um zu überprüfen, dass der Erfolg

Versuch genannt wird:

it 'Should trigger events on save', (done) -> 
    originalSave = MyModel.save 
    triggerSpy = sinon.spy() 
    MyModel.on('rating:saveSuccess', triggerSpy) 
    stub = sinon.stub(MyModel, "save", -> 
     successSpy = sinon.spy(arguments[1].success) 
     originalSave.apply(MyModel, arguments); 
     # want to call this line in the successSpy callback 
     expect(triggerSpy.callCount).to.equal(1); 
     done() 
    ) 
    MyView.submit({}) 
    expect(stub).to.have.been.called 

bearbeiten Zweiter Versuch (funktionierte, aber nicht sicher, ob es die richtige Art und Weise)

it 'Should trigger events on save', (done) -> 
    triggerSpy = sinon.spy() 
    MyView.on('saveSuccess', triggerSpy) 
    stub = sinon.stub(MyModel, "save", -> 
     arguments[1].success() 
     expect(triggerSpy.callCount).to.equal(1); 
     done() 
    ) 
    MyView.submitReval({}) 
    expect(stub).to.have.been.called 

Antwort

2

Beim Gerätetest muss eine Entscheidung über das betreffende Gerät getroffen werden. Wann/wo beginnt und endet der Test. Sie können entscheiden, dass die Codeabdeckung wichtig ist, die von einem Tool wie Istanbul berechnet wird.

In Ihrem ersten Beispiel wird der Code Model.save ausgeführt und sofort bestätigen, dass das Ereignis ausgelöst wurde. Dies bedeutet, dass Sie diese Funktion zu 100% abdecken. Aber denken Sie daran, Model.save wird ausgeführt, und Sie möchten möglicherweise keine Abdeckung auf dem Modell. Es besteht die Möglichkeit, dass dies nicht funktioniert, da die Operation save nicht synchron ist und daher die Assertionen ausgeführt werden, bevor der Code abgeschlossen wird. Wenn Sie nicht bereits sinons fakeServer verwenden, dann sollten Sie darüber nachdenken.

Ihr zweites Beispiel stubs Model.save und nie läuft es. Dadurch erhalten Sie eine Zeile Code Coverage (50%), aber wenn Sie bedenken, dass dieser Handler nur eine einzige Zeile hat, müssen Sie fragen, ob dieser Test auf diese Weise einen Wert hat.

Wenn Sie ein Unit-Test-Purist sind, und dieses Gerät zu testen wollen nur Abdeckung für die Funktion im Test hinzufügen, würde die folgende Arbeit:

it 'Should trigger events on save', -> 
    triggerSpy = sinon.spy() 
    MyModel.on('saveSuccess', triggerSpy) 
    stub = sinon.stub(MyModel, "save", (attr, opts) -> 
     opts.success.apply(null, [this, {}]) 
    ) 
    MyView.submit({}) 
    expect(stub).to.have.been.called 
    expect(triggerSpy.callCount).to.equal(1) 
    expect(triggerSpy.args[0][0]).to.deep.equal({}) 

Dies liefert 100% ige Abdeckung der Funktion (nur noch 2 Zeilen, aber das ist die Funktion). Es ist jetzt synchron, dass die Model.save nicht aufgerufen wird, sondern stubbed. Es bestätigt die endgültige Ausgabe der Funktion, das Ereignis wird ausgelöst. Und es testet auch, dass die Antwort aus dem Speichern in dem Ereignis enthalten ist.

Wenn Sie kein Purist sind, dann schauen Sie sich sinons fakeServer an.