У меня были некоторые интересные трудности, когда я пытался проверить, правильно ли представления связаны с событиями. В магистрали мы обычно привязываемся к событиям в методе инициализации, используя что-то вроде: 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();
Это работает, но я ищу лучшее решение. Спасибо
new MyView()
, вызывается метод инициализации, и функция рендеринга, существующая в объекте в это время, привязывается к событию изменения. С этого момента невозможно получить доступ к функции рендеринга, которая привязана к событию изменения — она заблокирована в замыкании. - person idbentley   schedule 18.01.2012