Sun*_*dhu 3 backbone.js jasmine d3.js
我试图使用Jasmine触发d3事件.特别是,我想检查我的事件监听器是否使用Jasmine间谍进行调用.
例如,如果我将d3缩放行为附加到svg元素(我的前端使用Backbone.js):
代码(a):
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")
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
另一方面,(正如一个完整性检查)如果我将'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")
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一些见解,为什么我似乎无法在Jasmine测试中触发D3变焦事件,即代码(b)使用我上面的原始视图,即代码(a)?
Backbone触发jQuery事件,它似乎没有在jQuery世界之外注册.这里解释了一些解决方法.但这是使用Jasmine测试D3事件的一般方法.
it('should trigger a callback on custom events', function() {
fixture.datum(dataset)
.call(barChart);
var callback = jasmine.createSpy("filterCallback");
barChart.on('customHover', callback);
var bars = fixture.selectAll('.bar');
bars[0][0].__onmouseover();
var callBackArguments = callback.argsForCall[0][0];
expect(callback).toHaveBeenCalled();
expect(callBackArguments).toBe(dataset[0]);
});
Run Code Online (Sandbox Code Playgroud)
D3公开DOM对象上的事件.所以你可以附上一个间谍并触发它.
归档时间: |
|
查看次数: |
1764 次 |
最近记录: |