javascript-如果所有方法都是私有的,如何测试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的测试也将失败.所以现在我有一个失败的方法,但是有两个失败的测试,这意味着我不知道问题出在哪里.显然,在这么小的事情上没什么大不了的,但是在更大的项目上,我可以看到这变得很痛苦.

那我在这里想念什么吗?有没有更好的方法来进行测试?

我想我可以命令测试以与测试方法相同的顺序运行,但是随着项目的复杂性不断增长,我可能会觉得这很难维护.

很抱歉这个长期的问题.我不确定如果没有例子怎么问.

附言我知道我的测试并没有真正坚持,只是被认为是一个过于简单的例子.

解决方法:

我认为,请勿测试私有方法.您应该针对公共接口进行测试,以确保其可以正常工作,而不必担心内部结构,因为它们是私有的,因此它们应该能够*更改.

关于小型项目还是大型项目:随着项目的扩大,应该分解项目中的组件,以使代码保持可维护性.因此,诸如isDiv之类的功能可能会放入实用程序类/对象中,该实用程序类/对象可以在许多对象中使用,而不是在许多不同的类中具有很多副本.像这样分开时,该功能将在公共接口中公开,因此可以测试.

查看:https://softwareengineering.stackexchange.com/questions/100959/how-do-you-unit-test-private-methods

上一篇:javascript-如何用茉莉花测试邮寄电话?


下一篇:javascript-测试使用$routeParams作为URL参数的AngularJS服务