Dav*_*ite 21 javascript javascript-events coffeescript backbone.js jasmine
我有一个Backbone模型:
class DateTimeSelector extends Backbone.Model
initialize: ->
@bind 'change:date', @updateDatetime
@bind 'change:time', @updateDatetime
updateDatetime: =>
# do some stuff with the sate and time
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
它似乎在我在浏览器中使用它时工作,但我似乎无法通过测试.任何人都可以开导我吗?
vad*_*ich 48
duckyfuzz,您遇到此问题,因为当您创建间谍(实际上包装原始函数并创建一个间接级别以插入其跟踪方法调用的服务)时,事件的绑定已经发生.这意味着即使间谍包裹了原始函数,事件绑定也会引用原始函数而不是包装的间谍.因此,当您进行测试时,原始函数会在事件触发器上执行,但间谍跟踪在上面一级并且不会执行.
为了确保事件绑定实际指向包装的间谍功能,您必须在创建模型对象之前创建间谍(如果您正在测试视图,则必须如此).为此,在原型上创建间谍.该类的"方法":
在beforeEach - > section之前@datetime = new DateTimeSelector()创建spy:@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()
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果你使用jasmin-sinon.js插件,那么你的语法很好
| 归档时间: |
|
| 查看次数: |
15616 次 |
| 最近记录: |