backbone.js - 使用 Jasmine 监视 Backbone View 回调方法

标签 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.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 按预期调用了一次,这是怎么回事?

最佳答案

问题是当你在 triggerFilterEvent 上分配一个 spy 时,一个事件监听器已经设置为调用原始函数而不是 spy(initialize 被调用时你初始化 View )

为了解决这个问题,您可以在初始化 View 之前监视原型(prototype):

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

关于backbone.js - 使用 Jasmine 监视 Backbone View 回调方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20974670/

相关文章:

iphone - 如何在实用程序类型的应用程序中查找错误?

Android 忽略我的 setWidth() 和 setHeight()

javascript - 如何正确使用 Jasmine spy 来模拟交易

javascript - 假 Ajax 请求

javascript - Backbone.js 事件未触发

django - 如何更改 django 中的过滤器以反射(reflect)不等于?

unit-testing - 有没有办法强制 karma 或 Protractor 执行跳过的 Jasmine 测试?

javascript - Angular 2/Jasmine 测试输入字段绑定(bind)

django - 适合单页 Web 应用程序的后端?

javascript - Backbone.js 的初始化顺序