Шпионаж в 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();