在尝试测试视图是否正确绑定到事件时,我遇到了一些有趣的困难。在骨干网中,我们通常使用如下方式绑定到初始化方法中的事件: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();
这可行,但我正在寻找更好的解决方案。谢谢