测试Marionette vent.on听众

时间:2014-04-01 14:50:29

标签: backbone.js jasmine marionette

我有一个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()

1 个答案:

答案 0 :(得分:2)

App.vent.on函数中对initialize的调用将引用传递给视图实例的this.updateDVR函数 - 这恰好发生在{{1}之前在测试的spyOn(this.showDvr, ...)中。因此,当您触发事件时,触发器会调用保留对实际beforeEach函数的引用,而不是间谍。

您应该可以通过将回调函数传递给updateDVR调用来解决此问题(抱歉javascript,我不是coffeescripter!):

App.vent.on

这将使事件处理程序在事件被触发时查找名为“updateDVR”的符号,&它将根据你的测试期望给你的间谍打电话。

编辑已更新以保留this.onUpdateCb,以便我们可以在关闭时取消注册侦听器。