骨干和要求如何添加Qunit(Backbone and Require how to add Qun

2019-07-17 11:27发布

我使用的骨干和Require.js。 一切都很正常,但我想一些单元测试添加到我的应用程序。 我决定使用Qunit.js。

在我main.js文件中创建新的对象EventsView

require.config({
  paths: {
    jquery:                 'libs/jquery',
    underscore:             'libs/underscore',
    backbone:               'libs/backbone',
    qunit:                  'test/libs/qunit-1.10.0
    }
 });
 require(['view/eventsView', 
          'test/eventsView_test', 
          'test/eventView_test' ], function(EventsView){
           var events = new EventsView; //here I create first object my View
 });

eventsView.js initialize我呈现的主视图

  define(['jquery',
          'backbone',
          'underscore',
          'collection/eventC',
          'model/eventM',
          'view/eventView'], function($, Backbone,_,EventC,EventM, EventView,){

 var EventsView = Backbone.View.extend({
    el: $(".contener"),     
    initialize: function(){
        this.render();
     },
     ....//other functions
    });
     return EventsView;
 });

所以现在我需要从这一观点在其他文件eventsView_test.js调用函数。 我不能像这样做,因为该视图将再次呈现:

  define(['jquery','qunit','view/eventsView'], function($,qunit,EventsView){
    //var eventsView = new EventsView(); // I can't create object here 

    test( "first_test_func", function() {
        var result = eventsView.first_test_func(2,2);
        equal( result, 4, "2 square equals 4" );
    });

我该怎么办? 我是否需要某种形式的单身或别的什么?

Answer 1:

意想不到的问题,一个是我看到所有的时间。

其实,我创建了我冠以“引导”模式解决了这个,但称它为任何你想要的。 关键是,骨干视图不表现自己,而是任何人消耗它负责这一点。 你会碰到与取()问题之类的,所以这令人欣慰的解决这一点。

我们的目标:不要单元测试渲染,只是跳过它!

你的看法变成是这样的:

require(function () {
    var view = Backbone.View.extend({
        // initialize is executed on new, just as you found
        initialize: function (options) {
            _.bindAll(this);

            // Create models, initialize properties, and bind to events here.
            // Basically only do __UNEXPENSIVE__, non-dom-changing things that
            // you don't care get executed a lot.                

            this.someCollection = new Backbone.Collection();
            this.someCollection.on('add', this.onSomeCollectionAdd);
        },

        // bootstrap is for server-side operations that you don't want executed
        // by every single test.
        bootstrap: function () {
            this.someCollection.fetch().done(this.render);
        },

        render: function () {
            this.$el.html(...);
        },

        first_test_func: function () {

        }
    });

    return view;
});

这将如何在你的应用程序消耗:

require(['viewpath'], function (myView) {
    var instance = new myView({ el: $('#something') });
    instance.bootstrap(); //triggers fetch, or if no fetch needed, just render
});

这现在可以单位无后顾之忧测试。

define(['jquery','qunit','view/eventsView'], function($,qunit,EventsView){

    test( "first_test_func", function() {
        // Now this line won't call the server, or render.
        // You can isolate/test what you want.
        var eventsView = new EventsView();
        var result = eventsView.first_test_func(2,2);
        equal( result, 4, "2 square equals 4" );
    });
});

使用SinonJS

我强烈建议检查出SinonJS 。 这是惊人的单元测试的JavaScript,特别是骨干实现,由于其强大的嘲讽可以从防止渲染和服务器调用中使用( fetchsave ,从实际击中服务器等),同时还允许你断言,他们接到电话。



文章来源: Backbone and Require how to add Qunit