【问题标题】:Spying on Backbone View callback method with Jasmine用 Jasmine 监视 Backbone View 回调方法
【发布时间】:2014-01-25 07:33:45
【问题描述】:

我有以下看法:

  ...
  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()SpyOn a backbone view method using jasmine

但是我的测试仍然失败:

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 被按预期调用了一次,怎么会呢?

【问题讨论】:

    标签: backbone.js view jasmine spy


    【解决方案1】:

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

    为了避免你可以窥探原型,初始化视图之前:

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

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多