У меня были некоторые интересные трудности, пытаясь проверить, правильно ли привязаны взгляды к событиям. В магистрали мы обычно привязываемся к событиям в методе инициализации, используя что-то в строках: 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 AT THAT TIME. Таким образом, когда вы добавляете своего шпиона, он обертывает функцию рендеринга и устанавливает ее на место в 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();
Это работает, но я ищу лучшее решение. Благодаря