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, то ваш синтаксис в порядке