【发布时间】:2014-05-12 10:28:36
【问题描述】:
我有一个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()
【问题讨论】:
-
我认为 Jasmine 间谍取代了原来的功能,不是吗? (你必须调用 .andCallThrough() 让它调用原始函数。)所以我不确定你的原始 updateDVR() 是如何被调用来在这个测试中创建日志消息的。当您的间谍不在位时,另一个测试是否可以调用 updateDVR() 并记录该消息?
-
@MikeStapp 很好地调用了间谍接管该功能的控制权。让我看看另一个规范是否给了我们一个误报
-
@MikeStapp 你是一个人。如果我调用
Arc.vent.trigger,我会得到默认的方法行为,但如果我调用this.showDvr.updateDVR,我什么也得不到(预期的,因为间谍没有传递给常规函数)。出于某种原因,spy没有被放置在对象上。它似乎只有在测试框架中有上下文 -
Arc.vent是App.vent的别名吗? -
@pdoherty926 是的。具体来说,我们称我们的“应用程序”Arc,因此它是包含所有 Marionette/Backbone 信息的窗口变量
标签: backbone.js jasmine marionette