Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js Jasmine规格测试中触发d3事件_Backbone.js_D3.js_Jasmine - Fatal编程技术网

Backbone.js Jasmine规格测试中触发d3事件

Backbone.js Jasmine规格测试中触发d3事件,backbone.js,d3.js,jasmine,Backbone.js,D3.js,Jasmine,我试图用Jasmine触发d3事件。特别是,我想检查是否正在使用Jasmine spy调用我的事件侦听器 例如,如果我将d3缩放行为附加到svg元素(我使用Backbone.js作为前端): 代码(a): 茉莉花中的以下测试失败: 代码(b): 另一方面,(作为健全性检查)如果我将“dblclick”事件绑定到我的视图,如下图所示,则上述测试即代码(b)将通过: 代码(c): 有谁能告诉我为什么我不能在Jasmine测试中触发D3 zoom事件,即代码(b),使用我的原始视图(即代码(a)吗 主

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

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

代码(a):

茉莉花中的以下测试失败:

代码(b):

另一方面,(作为健全性检查)如果我将“dblclick”事件绑定到我的视图,如下图所示,则上述测试即代码(b)将通过:

代码(c):


有谁能告诉我为什么我不能在Jasmine测试中触发D3 zoom事件,即代码(b),使用我的原始视图(即代码(a)吗

主干网触发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]);
});

D3公开DOM对象上的事件。所以你可以附加一个间谍并触发它

正如M.Bostock在中所说:“jQuery触发器不发送实际事件;它只调用自己的侦听器。”

使用vanilla JS分派真实事件的一种方法是(基于中用户“handler”的回复):

代码(b-修改)


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

a由@biovision:

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();

你应该把你的答案扩展成你自己的,因为你永远不知道Biovisualize的帖子是否会因为任何原因被删除。
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")  
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]);
});
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) 
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();