2014-01-07 8 views
1

Я следующий вид:Шпионаж на Backbone Посмотреть метод обратного вызова с жасмином

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

ответ

6

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

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

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

Brilliant. Это решило проблему для меня. –