2017-01-09 8 views
1

У меня есть вид с submit метод. Как написать модульный тест, чтобы проверить, что событие срабатывает в следующем кодеunit test Магистральная модель save handle

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's fakeServer, тогда вы должны его рассмотреть.

Ваш второй пример заглушки Model.save и никогда не запускает его. Это даст вам 1 строку покрытия кода (50%), но учитывая, что этот обработчик имеет только одну строку, вам нужно спросить, имеет ли этот тест какое-либо значение таким образом.

Если вы модульное тестирование пуристы, и хотите, чтобы это модульное тестирование, чтобы только добавить покрытие для функции испытываемых следующий будет работать:

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's fakeServer.