我正在尝试使用 Jasmine 触发 d3 事件。特别是,我想检查我的事件侦听器是否正在使用 Jasmine 间谍被调用。
例如,如果我将 d3 缩放行为附加到 svg 元素(我在前端使用 Backbone.js):
代码(一):
class MyView extends Backbone.View
initialize: ->
zoom = d3.behavior.zoom().on("zoom", this.zoom_listener)
d3.select(this.el).append("svg").attr("class", "viewport").call(zoom)
zoom_listener: ->
console.log("zoom called")
Jasmine 中的以下测试失败:
代码(b):
it "calls zoom listener on dblclick", ->
zoom_spy = spyOn(MyView.prototype, "zoom_listener").andCallThrough()
view = new MyView()
view.$(".viewport").trigger("dblclick")
waitsFor((-> zoom_spy.callCount == 1), "Call zoom", 1000)
另一方面,(作为健全性检查)如果我将“dblclick”事件绑定到我的视图,如下所示,上面的测试即代码(b)将通过:
代码(c):
class MyView extends Backbone.View
events:
"dblclick" : "zoom_listener"
initialize: ->
zoom = d3.behavior.zoom().on("zoom", this.zoom_listener)
d3.select(this.el).append("svg").attr("class", "viewport")
# .call(zoom) # commented off this line for the sanity check
zoom_listener: ->
console.log("zoom called")
谁能给我一些见解,为什么我似乎无法使用我上面的原始视图即代码(a)在 Jasmine 测试中触发 D3 缩放事件,即代码(b)?