Шпионаж в Backbone Просмотр метода обратного вызова с Jasmine

У меня есть следующий вид:

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

  });
  ...

Мой Spec выглядит следующим образом:

 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 метод просмотра позвоночника с использованием жасмина

Однако мой тест по-прежнему не проходит с:

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 вызывается один раз, как и ожидалось. Почему?

1 ответ

Решение

Проблема в то время, когда вы назначаете шпиона triggerFilterEventпрослушиватель событий уже настроен на вызов исходной функции, а не шпиона (initialize вызывается при инициализации вида)

Чтобы обойти это, вы можете следить за прототипом, прежде чем инициализировать представление:

spyOn(TreeView.prototype, 'triggerFilterEvent');
var treeView = new TreeView();
Другие вопросы по тегам