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监视主干视图回调方法_Backbone.js_View_Jasmine_Spy - Fatal编程技术网

Backbone.js 用Jasmine监视主干视图回调方法

Backbone.js 用Jasmine监视主干视图回调方法,backbone.js,view,jasmine,spy,Backbone.js,View,Jasmine,Spy,我有以下看法: ... var TreeView = Backbone.View.extend({ el: '#org-tree', initialize: function() { eventBus.on("route:change", _.bind(this.triggerFilterEvent, this)); }, render: function() { ... }, foo: function() { console.

我有以下看法:

  ...
  var TreeView = Backbone.View.extend({
    el: '#org-tree',

    initialize: function() {
      eventBus.on("route:change", _.bind(this.triggerFilterEvent, this));
    },

    render: function() { ... },

    foo: function() { console.log("foo"); },

    triggerFilterEvent: function(name) {
      this.foo();
      ...
    }

  });
  ...
我的规范如下所示:

 describe('TreeView', function() {
    var treeView = new TreeView();

    it('calls triggerFilterEvent when receiving a route:change', function() {
      spyOn(treeView, 'triggerFilterEvent');
      spyOn(treeView, 'foo');
      treeView.delegateEvents();
      eventBus.trigger("route:change", "test");
      console.log('TriggerCOunt:' + treeView.triggerFilterEvent.callCount);
      console.log('FooCount: ' + treeView.foo.callCount);
      expect(treeView.triggerFilterEvent).toHaveBeenCalled();
    });
  });
我按照以下解决方案中的建议添加了
treeView.delegateEvents()

但是,我的测试仍然失败:

LOG: 'triggerFilterEvent with: test'
LOG: 'Event has been triggered: route:change'
LOG: 'TriggerCOunt:0'
LOG: 'FooCount: 1'
Error: Expected spy triggerFilterEvent to have been called.

方法foo按预期调用了一次,这是怎么回事?

问题在于,当您在
triggerFilterEvent
上分配间谍时,事件侦听器已设置为调用原始函数而不是间谍(
initialize
在初始化视图时被调用)

在初始化视图之前,要绕过可以监视原型的问题,请执行以下操作:

spyOn(TreeView.prototype, 'triggerFilterEvent');
var treeView = new TreeView();