javascript – 使用jasmine测试backbone.js应用程序 – 如何在视图上测试模型绑定?

尝试测试视图是否正确绑定到事件时,我有一些有趣的苦难。在骨干中,我们通常使用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的初始化函数中,事件get在这个时间绑定到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();

这是有效的,但我正在寻找一个更好的解决方案。谢谢

最佳答案
你可以尝试窥探某些东西,而不是在回调中间谍。然后测试绑定被调用w /适当的参数。到目前为止,这是为我工作的。我使用sinon.js而不是茉莉花的内置间谍。 sinon.js使得在一个方法调用的堆栈中传递给一个方法调用的args(例如,在一个视图init中绑定的一堆调用)来测试一下这个args。所以我没有单独测试这个想法,但相信应该是可能的。

spyOn(this.legendView.groupData, 'bind');
this.myView = new MyView();
expect(this.legendView.groupData.mostRecentCall.args).toEqual('change', this.myView.render); // example!! only works if testing a single call to bind or the last call in a series (ie mostRecentCall)

和w / sinon.js

sinon.spy(this.legendView.groupData, 'bind');
this.myView = new MyView();
expect(this.legendView.groupData.bind.calledWith('change', this.myView.render); // works w/ any number of calls to bind

转载注明原文:javascript – 使用jasmine测试backbone.js应用程序 – 如何在视图上测试模型绑定? - 代码日志