我有一个骨干模型:
class DateTimeSelector extends Backbone.Model
initialize: ->
@bind 'change:date', @updateDatetime
@bind 'change:time', @updateDatetime
updateDatetime: =>
# do some stuff with the sate and time
我使用该代码进行了一些测试jasmin http://pivotal.github.com/jasmine/ and sinon.js http://sinonjs.org/docs/#sinonspy
describe "DateTimeSelector", ->
beforeEach ->
@datetime = new DateTimeSelector()
describe "updateDatetime", ->
beforeEach ->
@updateSpy = sinon.spy(@datetime, 'updateDatetime')
afterEach ->
@datetime.updateDatetime.restore()
# passes
it "should be called when we call it", ->
@datetime.updateDatetime()
expect(@updateSpy).toHaveBeenCalledOnce()
# fails
it "should be called when we trigger it", ->
@datetime.trigger 'change:date'
expect(@updateSpy).toHaveBeenCalled()
# fails
it "should be called when we set the date", ->
@datetime.set { date: new Date() }
expect(@updateSpy).toHaveBeenCalled()
当我在浏览器中使用它时,它似乎可以工作,但我似乎无法通过测试。谁能启发我吗?
duckyfuzz,您遇到这个问题是因为当您创建间谍时(它实际上包装了原始函数并创建了一个间接级别以插入其跟踪方法调用的服务),事件的绑定已经发生。这意味着即使间谍包装了原始函数,事件绑定也会引用原始函数而不是包装的间谍。因此,当您测试时,原始函数会在事件触发器上执行,但间谍跟踪是上面一级的并且不会执行。
为了确保事件绑定实际上指向包装的间谍函数,您必须在创建模型对象之前创建间谍(如果您正在测试视图,则同样如此)。为此,请在类的原型上创建间谍。“方法”:
in the 在每个之前->之前的部分@datetime = new DateTimeSelector()创建间谍:@updateSpy = sinon.spy(日期时间选择器.prototype, '更新日期时间')
一定要改变你的每个之后->将原型恢复正常的部分,如下所示:@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 插件,那么您的语法没问题
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)