首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Jasmine规格测试中触发d3事件

在Jasmine规格测试中触发d3事件
EN

Stack Overflow用户
提问于 2013-05-16 05:38:32
回答 3查看 2.3K关注 0票数 3

我正在尝试使用Jasmine触发d3事件。特别是,我想检查我的事件侦听器是不是使用Jasmine spy调用的。

例如,如果我将d3缩放行为附加到一个svg元素(我使用Backbone.js作为我的前端):

代码(a):

代码语言:javascript
运行
复制
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):

代码语言:javascript
运行
复制
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‘事件绑定到我的视图,如下所示,上面的测试,即Code (b)将通过:

代码(c):

代码语言:javascript
运行
复制
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")  

谁能给我一些洞察力,为什么我似乎不能在Jasmine测试中触发D3缩放事件,也就是代码(b),使用我上面的原始视图,即代码(a)?

EN

回答 3

Stack Overflow用户

发布于 2013-05-16 07:57:32

Backbone触发jQuery事件,这似乎不会在Backbone之外注册。here中解释了一些解决方法。但这里是使用Jasmine测试D3事件的一般方法。

代码语言:javascript
运行
复制
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]);
});

D3公开DOM对象上的事件。这样你就可以带上一个间谍然后触发它。

票数 5
EN

Stack Overflow用户

发布于 2013-05-17 11:47:58

正如M.Bostock在https://github.com/mbostock/d3/issues/906中所说:"jQuery触发器不调度实际事件;它只调用自己的侦听器。“

使用普通JS分派实际事件的一种方法是(基于How to invoke "click" event programmatically in d3?中用户“处理程序”的回复):

代码(b-已修改)

代码语言:javascript
运行
复制
it "calls zoom listener on dblclick", ->
  zoom_spy = spyOn(MyView.prototype, "zoom_listener").andCallThrough()
  view = new MyView()

  jQuery.fn.custom_mouse_dblclick = (->
    this.each(((i, element) ->
      evt = document.createEvent("MouseEvent")
      evt.initMouseEvent(
        "dblclick",
        true,
        true,
        window,
        0,
        0,
        0,
        0,
        0,
        false,
        false,
        false,
        false,
        0,
        null)
      element.dispatchEvent(evt)
    ))
  )
  view.$(".viewport").custom_mouse_dblclick()
  waitsFor((-> zoom_spy.callCount == 1), "Call zoom", 1000) 

因此,当对原始问题中的代码(a),即具有d3.zoom()行为的svg元素执行时,Code (b-modified)中的Jasmine测试通过。

票数 0
EN

Stack Overflow用户

发布于 2013-07-23 08:22:00

@Biovisualize对该示例的一个变体:

代码语言:javascript
运行
复制
fixture.datum(dataset).call(barChart);

var callback = jasmine.createSpy("filterCallback");
barChart.on('customHover', callback);
//to trigger all elements    
fixture.selectAll('.bar').each(function() {
    this.__onmouseover();
});

expect(callback).toHaveBeenCalled();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16575408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档