Я не совсем уверен, но, насколько я понимаю, происходит следующее:
- Вы создаете новое представление, которое вызывает функцию
initialize
, и привязываете view.addMessage
к своей коллекции., - При этом Backbone берет функцию и сохраняет ее в хранилище событий вашей коллекции.
- Затем вы шпионите за
view.addMessage
, что означает, что вы перезаписываете его с помощью шпионской функции.Это не повлияет на функцию, которая хранится в хранилище событий коллекции.
Так что у вас есть некоторые проблемы с вашим тестом.У вас есть множество зависимостей, которые вы не исключаете.Вы создаете группу дополнительных опорных моделей и коллекций, что означает, что вы проверяете не только свое представление, но и опорную коллекцию и функциональность моделей.
Не следует проверять, что collection.bind
будет работать, но что вы вызвали bind
в коллекции с параметрами 'add', this.addMessage, this
initialize: function() {
//you dont
this.collection.bind('add', this.addMessage, this);
},
Итак, коллекцию легко смоделировать:
var messages = {bind:function(){}, each:function(){}}
spyOn(messages, 'bind');
spyOn(messages, 'each');
this.view = new MessageContainerView({ collection: messages });
expect(message.bind).toHaveBeenCalledWith('bind', this.view.addMessage, this.view);
this.view.render()
expect(message.each).toHaveBeenCalledWith(this.view.addMessage);
... and so on
Делая так, вы проверяете только свой код и независимости от Backbone.