javascript - 用 Jasmine 测试backbone.js应用程序-如何测试 View 上的模型绑定(bind)?

标签 javascript view backbone.js jasmine

在尝试测试 View 是否正确绑定(bind)到事件时,我遇到了一些有趣的困难。在主干网中,我们通常使用如下方式绑定(bind)到初始化方法中的事件:something.bind("change", this.render); .在我的测试中,我想确保设置了这个绑定(bind),所以我做了以下事情:

this.myView = new MyView();
spyOn(this.myView, "render");;
this.legendView.groupData.trigger("change");
expect(this.legendView.render).toHaveBeenCalled();

但是,那是行不通的。因为绑定(bind)发生在 MyView 的初始化函数中,所以事件在那个时间绑定(bind)到了 myView 的渲染函数。因此,当您添加 spy 时,它会包装渲染函数并将其设置回 myView.render 中的位置。但是第一次绑定(bind)创建的闭包仍然存在,我们完全被骗了。那么我们能做些什么呢?我所做的是将我的绑定(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();

这可行,但我正在寻找更好的解决方案。谢谢

最佳答案

我已经设法使用原型(prototype)修补来实现这一点。在创建 View 实例之前,spyOn构造函数的原型(prototype)。

spyOn(MyView.prototype, 'changeSelected');
var view = new MyView();
view.selectSomething();
expect(view.changeSelected).toHaveBeenCalled();

关于javascript - 用 Jasmine 测试backbone.js应用程序-如何测试 View 上的模型绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471457/

相关文章:

android - 如何将 "complex"阴影添加到 android 中的 View ?

javascript - WordPress NinjaForms JavaScript API 提交前

javascript - 根据行为怪异的页面的字符限制压缩的字符串数组

javascript - docker , postman 。端口已经分配

algorithm - 带有 "autoplay=1"的嵌入式 youtube 视频。它是否计入观看次数?

ios - 拖放 2 个不同的 View

javascript - Backbone.js - 访问父 View 中的所有 subview "collection"

backbone.js - 使用 Jasmine 监视 Backbone View 回调方法

JavaScript 不将变量写为数字(循环)

javascript - react 路由器在按钮单击时不起作用