这是一个简单的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