我在嘗試測試視圖是否正確綁定事件時遇到了一些有趣的磨難。在主幹中,我們通常使用以下幾行代碼綁定到初始化方法中的事件:something.bind("change", this.render);
。在我的測試中,我想確保這個綁定已經建立,所以我做了以下操作:用jasmine測試backbone.js應用程序 - 如何在視圖上測試模型綁定?
this.myView = new MyView();
spyOn(this.myView, "render");;
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();
但是,那不行。因爲綁定發生在MyView的初始化函數中,所以事件get在當時綁定到myView的渲染函數。所以,當你添加你的間諜時,它將包裝渲染函數,並將其設置回myView.render。但由第一個綁定產生的封閉仍然存在,我們完全茫然。那麼我們能做些什麼呢?我所做的,是將我的bind調用的一個單獨的功能,是這樣的:
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()'時,initialize方法被調用,並且此時對象中存在的render函數綁定到change事件。從那時起,不可能訪問綁定到change事件的render函數 - 它被鎖定在閉包中。 – idbentley
感謝您的澄清。 –