ビューがイベントに正しくバインドされているかどうかをテストしようとすると、いくつかの興味深い問題が発生しました。バックボーンでは、通常、次の行に沿って何かを使用して、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の初期化関数で発生するため、イベントはその時点でmyViewのレンダリング関数にバインドされます。したがって、スパイを追加すると、render関数がラップされ、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();
これは機能しますが、より良い解決策を探しています。ありがとう