测试Backbone.js视图

时间:2014-04-23 14:16:57

标签: javascript unit-testing backbone.js jasmine

我目前正在使用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,但现在看来我必须在我的视图中测试我的应用程序的其他元素......

1 个答案:

答案 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.  
}; 

嗯,这就是我试图保持观点清洁的方式 根据我的经验,很容易立即找回所有内容;并注意您还可以使用帮助程序对象来隔离更具体的业务功能 不确定是否有其他人有更好的解决方案。