我目前正在使用Jasmine测试骨干视图,我遇到了一些麻烦。我试图将View与所有其他元素(实例化的另一个视图,集合)隔离开来,但这几乎是不可能的。
initialize: function(options) {
if(options.return) {return;}
var view = this;
var name = options.name;
var localizedElements = app.helpers.Locale.l().modules.case[name];
var swap, notification;
this.name = name.capitalizeFirstLetter();
this.collection.on('sort', this.refreshGui, this);
return this.render('/case/' + name + '/' + this.name + 'Box.txt', localizedElements, this.$el).done(function() {
new app.views.Buttons({el: view.$el.find('.Buttons')});
_.each(view.collection.models, function(model) {
new app.views['Folded' + this.name]({model: model, el: this.$('table')});
}, view);
if(!view.collection.findWhere({isPreferred: true}) || !view.collection.findWhere({isPrescribedForms: true})) {
if(!view.collection.findWhere({isPreferred: true})) {
swap = {entity: 'address', preferenceType: 'preferred'};
notification = app.helpers.Locale.l().generic.warningMessages.missingPreference.swap(swap);
var preferredNotification = [notification];
app.helpers.Notification.addNotifications('warnings', {missingPreferred: preferredNotification});
}
if(!view.collection.findWhere({isPrescribedForms: true})) {
swap = {entity: 'address', preferenceType: 'prescribed forms'};
notification = app.helpers.Locale.l().generic.warningMessages.missingPreference.swap(swap);
var prescribedFormsNotification = [notification];
app.helpers.Notification.addNotifications('warnings', {missingPrescribedForms: prescribedFormsNotification});
}
}
});
},
例如,在有两个“ifs”的情况下,视图正在与集合和帮助者交谈:“通知帮助程序”。如果我嘲笑集合和通知助手,我怎么想测试这部分代码呢?我的意思是我正在测试VIEW,但现在看来我必须在我的视图中测试我的应用程序的其他元素......
答案 0 :(得分:0)
我试图将View与所有其他元素隔离开来
我不确定这对您是否有帮助,但我创建了自己的策略来处理这个问题。
Backbone的问题通常确实是,视图对象变得混乱了功能
就个人而言,我喜欢我的观点来处理DOM交互,听DOM事件
但是为了执行与后端的业务逻辑/交互,我更喜欢将此功能委托给其他外部'对象。
另一方面,模特可能会'处理基本数据验证,但只是在我的应用程序中与服务器进行RESTful交互。
我是如何通过实例化自定义Javascript('控制器')对象来解决问题的,这些对象充当视图和模型之间的中介。
这个对象只不过是一个看起来像这样的对象:
var Some_controller = function(options){
this.makeView();
};
Some_controller.prototype.makeView = function(){
var someView = new Some_view({'controller': this});
someView.render(); //Render, but can also take care of proper view cleanup to avoid zombie objects
};
Some_controller.prototype.getModel = function(){
var someModel = new Some_model();
var promise = model.fetch();
return promise; //Promise be called from the view, because the controller is passed via the options, when the view is instantiated.
};
嗯,这就是我试图保持观点清洁的方式 根据我的经验,很容易立即找回所有内容;并注意您还可以使用帮助程序对象来隔离更具体的业务功能 不确定是否有其他人有更好的解决方案。