我真的想开始对我的代码进行单元测试,所以我想开始在我使用QUnit编写的一些插件中添加测试。但是,我喜欢在我的插件中创建自定义类/对象以将属性和方法组合在一起,并且有一些分离。最重要的是,它们有自己的私有方法。
我试图了解重构代码的最佳方法,以便进行单元测试。我不喜欢将所有内容公开,或者用一堆自定义对象污染窗口对象。但也许那应该怎么做呢?
也许我只需要一些关于工作流程的更好的想法。就像开发脚本可能都是公开的一样,但是当我使用Grunt缩小它时,它会将它重新包装成一个匿名函数吗?
无论如何,我很快就写了这个作为我所谈论的插件结构的粗略例子。我如何编写单元测试来测试' getNewPosition'方法
(function( $ ) {
"use strict";
// Custom Object
var MyClass = function( element ) {
var speed = 1;
// Private Function
var getNewPosition = function() {
var currentPosition = parseFloat( element.css( "top" ) );
return currentPosition + speed;
}
return {
// Public Function
update: function() {
var newPosition = getNewPosition();
element.css( "top", newPosition.toString() + "px" );
}
}
};
// jQuery Plugin
$.fn.myPlugin = function() {
var aryElements = [];
this.each( function() {
var myObj = new MyClass( $( this ) );
aryElements.push ( myObj );
});
$( window ).on( "scroll", function( event ) {
$.each( aryElements, function( i, element ) {
element.update();
});
});
return this;
};
}( jQuery ));
任何帮助将不胜感激!谢谢!
答案 0 :(得分:0)
在JS中测试私有方法没有简单的方法。我建议为任何公开的代码编写测试,并确保测试所有代码分支,以便您确信您的私有函数被调用。在您的代码示例中,MyClass
构造函数是全局可用的,update
方法调用getNewPosition()
所以答案就是确保您彻底测试update
,这将在转弯getNewPosition
(因此在一定程度上进行测试)。
我会在QUnit中写这样的东西:
QUnit.test( "Test MyClass update", function( assert ) {
var elem = $('<div />');
elem.css('top', '10px');
var c = new MyClass(elem);
c.update();
assert.equal( elem.css('top'), '11px', 'top has been updated' );
});