以下是一个简单的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。我知道我的测试并没有真正成功,它们只是一个过于简单的例子。
答案 0 :(得分:3)
在我看来,不要测试私有方法。您应该对公共接口进行测试,以确保它能够正常工作,而不用担心内部因素,因为它们应该能够自由更改,因为它们是私有的。
关于小项目与大项目的关系:随着项目变得越来越大,其中的组件应该被分解以使代码保持可维护状态。因此,诸如isDiv之类的函数可能被放入一个实用程序类/对象中,该实用程序类/对象可以在许多对象中使用,而不是在许多不同的类中具有许多副本。当它像这样被分离出来时,该函数将在公共接口中公开,因此是可测试的。
请参阅:https://softwareengineering.stackexchange.com/questions/100959/how-do-you-unit-test-private-methods