2014-01-07 42 views
1

骨干查看回调方法,我有以下看法:刺探茉莉

... 
    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被调用一次,怎么样?

回答

6

的问题是,当时你triggerFilterEvent分配一个间谍,事件侦听器已被设置为调用原始的功能,而不是间谍(当你初始化视图initialize叫)

要解决这个问题你可以窥探原型,你初始化视图以前

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

辉煌。这解决了我的问题。 –