У меня были некоторые интересные проблемы при попытке проверить, правильно ли были привязаны представления к событиям. В магистрали мы обычно привязываемся к событиям в методе инициализации, используя что-то вроде: something.bind ("change", this.render);
. В своем тесте я хочу убедиться, что эта привязка настроена, поэтому я сделал следующее:
this.myView = new MyView();
spyOn(this.myView, "render");;
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
Но это не сработает. Поскольку привязка происходит в функции инициализации MyView, событие привязывается к функции визуализации myView В ЭТО ВРЕМЯ. Итак, когда вы добавляете своего шпиона, он оборачивает функцию рендеринга и устанавливает ее на место в myView.render. Но закрытие, созданное первой привязкой, все еще существует, и мы полностью находимся взаперти. Так что мы можем с этим поделать? Что я сделал, так это переместил вызов привязки в отдельную функцию, например:
myView = Backbone.View.extend({
initialize: function(){
_.bindAll(this, "render");
this.initialize_model_bindings();
},
initialize_model_bindings: function(){
something.bind("change", this.render);
},
render: function(){ //... }
});
, и мой тест будет выглядеть так:
this.myView = new MyView();
spyOn(this.myView, "render");
this.myView.initialize_model_bindings();
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
Это работает, но я ищу лучшее решение. Спасибо