如果所有方法都是私有的,你如何测试jQuery插件?

时间:2014-06-06 22:56:19

标签: javascript jquery jasmine jasmine-jquery

以下是一个简单的jQuery插件示例:

它需要一个元素,如果它是div设置宽度

;(function ($, window, document, undefined) {
  var pluginName= 'changeDivWidth',
      defaults = {
        width: '50%'
      };

  function Plugin (element, options) {
    this.element = element;
    this.options = $.extend( {}, defaults, options );
    this._defaults = defaults;
    this._name = pluginName;
    this.init();
  }

  Plugin.prototype = {
    init: function () {
      if(this.isDiv()) {
        this.changeWidth();
      }
    },
    isDiv: function () {
      if (this.element.nodeName === 'DIV') {
        return true;
      }
      return false;
    },
    changeWidth: functioon () {
      $(this.element).css('width', this.options.width);
    }
  };

  $.fn[ pluginName ] = function ( options ) {
    return this.each(function() {
      if ( !$.data( this, "plugin_" + pluginName ) ) {
        $.data( this, "plugin_" + pluginName, new Plugin( this, options ) );
      }
    });
  };
}(jQuery, window, document));

我如何测试这个jQuery插件?

我的第一反应是我想对Plugin.prototype的每个方法进行单元测试,但这些是私有的,“你不应该测试私有方法”。所以我能看到的另一个选择是运行一系列集成测试,在不同的情况下调用插件,看看输出是什么。

所以说我想测试我的两个私有方法:

describe('changeDivWidth', function () {
  beforeEach(function () {
    loadFixtures('myFixtures.html');
  });

  it('should not change width of non-DIV elements', function () {
    var span = $('span').changeDivWidth({width: '30px'}).get(0);
    expect($(span).width()).not.toBe(30);
  });

  it('should change width of DIV elements', function () {
    var div = $('div').changeDivWidth({width: '30px'}).get(0);
    expect($(div).width()).toBe(30);
  });

});

很好,这似乎有用......除非Plugin.prototype.isDiv失败以致它总是返回false,那么Plugin.prototype.changeWidth的测试也会失败。所以现在我有一个失败的方法,但有两个失败的测试,这意味着我不知道问题出在哪里。显然,对于这么小的事情来说这没什么大不了的,但是在一个更大的项目上,我可以看到这变得很痛苦。

我在这里错过了一些东西吗?有没有更好的方法来测试它?

我想我可以命令我的测试按照与他们测试的方法相同的顺序运行,但随着项目复杂性的增加,我可以看到这很难维护。

抱歉这个冗长的问题。我不知道如何在没有例子的情况下问它。

P.S。我知道我的测试并没有真正成功,它们只是一个过于简单的例子。

1 个答案:

答案 0 :(得分:3)

在我看来,不要测试私有方法。您应该对公共接口进行测试,以确保它能够正常工作,而不用担心内部因素,因为它们应该能够自由更改,因为它们是私有的。

关于小项目与大项目的关系:随着项目变得越来越大,其中的组件应该被分解以使代码保持可维护状态。因此,诸如isDiv之类的函数可能被放入一个实用程序类/对象中,该实用程序类/对象可以在许多对象中使用,而不是在许多不同的类中具有许多副本。当它像这样被分离出来时,该函数将在公共接口中公开,因此是可测试的。

请参阅:https://softwareengineering.stackexchange.com/questions/100959/how-do-you-unit-test-private-methods