Ответ 1
duckyfuzz, вы столкнулись с этой проблемой, потому что когда вы создаете шпион (который фактически обертывает исходную функцию и создает уровень косвенности, чтобы вставлять свои службы вызова метода отслеживания), привязка событий уже имела место. Это означает, что даже если шпион обернул исходную функцию, привязка события ссылается на исходную функцию, а не на обернутый шпион. Следовательно, при тестировании исходная функция запускается в триггере события, но отслеживание шпиона на одном уровне выше и не выполняется.
Чтобы убедиться, что привязка события фактически указывает на завернутую функцию шпиона, вы должны создать шпион, прежде чем создавать объект модели (то же самое, если вы тестируете представления). Для этого создайте шпиона на прототипе. "Метод" класса:
в разделе beforeEach → до @datetime = new DateTimeSelector() создать шпион: @updateSpy = sinon.spy(DateTimeSelector.prototype, ' updateDatetime ')
обязательно измените раздел afterEach → , где вы вернете прототип в нормальное состояние, например: @updateSpy.restore()
это должен быть ваш код:
describe "DateTimeSelector", ->
beforeEach ->
@updateSpy = sinon.spy(DateTimeSelector.prototype, 'updateDatetime')
@datetime = new DateTimeSelector()
afterEach ->
@updateSpy.restore()
# passes
it "should be called when we call it", ->
@datetime.updateDatetime()
expect(@updateSpy).toHaveBeenCalledOnce()
# should pass now
it "should be called when we trigger it", ->
@datetime.trigger 'change:date'
expect(@updateSpy).toHaveBeenCalled()
# should pass now
it "should be called when we set the date", ->
@datetime.set { date: new Date() }
expect(@updateSpy).toHaveBeenCalled()
Кстати, если вы используете плагин jasmin-sinon.js, тогда ваш синтаксис прекрасен