单元测试jQuery插件中的私有函数

时间:2017-02-03 12:40:14

标签: jquery unit-testing jquery-plugins qunit

我真的想开始对我的代码进行单元测试,所以我想开始在我使用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 ));

任何帮助将不胜感激!谢谢!

1 个答案:

答案 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' );
});