У меня были некоторые интересные трудности при попытке проверить, правильно ли привязаны представления к событиям.В магистрали мы обычно привязываемся к событиям в методе initialize, используя что-то вроде: something.bind("change", this.render);
.В своем тесте я хочу убедиться, что эта привязка настроена, поэтому я сделал следующее:
this.myView = new MyView();
spyOn(this.myView, "render");;
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
Но это не сработает.Поскольку связывание происходит в функции инициализации MyView, событие get привязывается к функции рендеринга 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();
Это работает, но я смотрюдля лучшего решения.Спасибо