我有一个Layout
,其中有一个vent.on
调用,可以在模型启动时进行设置。
initialize: () ->
App.vent.on("deciseconds:updated", this.updateDVR)
updateDVR: () ->
console.log 'this updateDVR is called'
我想确保在我的应用中正确连接this.updateDVR
。在我的测试中,我有这个:
beforeEach ->
this.showDvr = new Arc.DvrApp.Show.DvrView()
spyOn(this.showDvr, 'updateDVR')
it "calls updateDvr when new data comes in", ->
Arc.vent.trigger("deciseconds:updated")
expect(this.showDvr.updateDVR).toHaveBeenCalled()
此规范失败,但当我查看我的日志时,我看到this updateDVR is called
,我在updateDVR
函数中登录的行。所以我知道这个函数正在调用。
我直接致电updateDVR
,规范通过:
it "calls updateDvr when new data comes in", ->
this.showDVR.updateDVR()
expect(this.showDvr.updateDVR).toHaveBeenCalled()
我认为vent
可能被视为异步函数,因此我尝试在expect
子句之前等待几秒钟以查看是否可行,但它没有:
it "calls updateDvr when new data comes in", ->
Arc.vent.trigger("deciseconds:updated")
setTimeout(myCheck, 3000)
myCheck = () ->
expect(this.showDvr.updateDVR).toHaveBeenCalled()
答案 0 :(得分:2)
App.vent.on
函数中对initialize
的调用将引用传递给视图实例的this.updateDVR
函数 - 这恰好发生在{{1}之前在测试的spyOn(this.showDvr, ...)
中。因此,当您触发事件时,触发器会调用保留对实际beforeEach
函数的引用,而不是间谍。
您应该可以通过将回调函数传递给updateDVR
调用来解决此问题(抱歉javascript,我不是coffeescripter!):
App.vent.on
这将使事件处理程序在事件被触发时查找名为“updateDVR”的符号,&它将根据你的测试期望给你的间谍打电话。
编辑已更新以保留this.onUpdateCb,以便我们可以在关闭时取消注册侦听器。