2017-01-09 1 views
1

私はsubmitメソッドでビューを持っています。どのように私は次のコードでイベントがトリガされていることをユニットテストバックボーンモデルセーブハンドル

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

ノートをチェックするためにユニットテストを書くのです:私は成功が呼び出されたことを確認する必要はありません

試み:

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 

編集 二回目(働いていたではなく、必ずその正しい方法)

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 

答えて

2

ユニットテストの際には、関係するユニットで決定する必要があります。テストがいつどこで開始され、終了するか。重要なことは、Istanbulのようなツールで計算されるコードカバレッジであると判断することができます。

最初の例ではModel.saveのコードが実行され、はすぐにのイベントが発生したことがアサートされます。つまり、この機能を100%カバーすることになります。しかし、Model.saveが実行されていることを覚えておいて、モデルのカバレッジが必要ない場合があります。可能性としては、save操作が同期していないため、コードが完了する前にアサーションが実行されるため、これが機能しない可能性があります。あなたがまだsinonのfakeServerを使用していない場合は、それを考慮する必要があります。

2番目の例のスタブModel.saveは実行されません。これは1行のコードカバレッジ(50%)を与えますが、このハンドラは1行しかないので、このテストにこのような値があるかどうかを確認する必要があります。静止画のみ(

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({}) 

これは、関数の100%のカバレッジを提供します。

あなたはユニットテストの純粋主義者であり、唯一のテスト中の機能のためにカバレッジを追加するには、このユニットテストをしたい場合は、次のように動作します2行ですが、それが関数です)。 Model.saveが呼び出されずにスタブされたので同期します。それは関数の最終出力をアサートし、イベントがトリガされます。また、保存からの応答がイベントに含まれているかどうかをテストします。

あなたが純粋でない場合は、sinonのfakeServerを見てください。