如何在jquery插件中单元测试内部函数?

时间:2011-03-30 19:39:59

标签: javascript jquery unit-testing jquery-plugins

在jQuery插件中我创建了辅助函数,比如这个

(function($) {

  var someHelperFunction = function(s, d) {
    return s*d;
  }
  var someOtherHelperFunction = function(s) {
    return s*2;
  }

// here goes the normal plugin code

})(jQuery);

现在我想从外面调用someHelperFunction,以便能够对它进行单元测试, 那可能吗?

5 个答案:

答案 0 :(得分:2)

Per this related question,我只想测试外部接口。

但是,如果您必须单独测试这些方法,则必须在其部署的上下文之外测试它们的“副本”作为内部方法。换句话说,创建一个客户端代码无法访问它们的对象,然后在预处理过程中将这些版本与外部脚本拼凑在一起。听起来很多工作,但是,嘿,这是隐藏方法的重点,对吧? (使它们无法到达。)

答案 1 :(得分:1)

如果内部函数需要测试,这是一个很好的指示,它们应该位于某个单独的模块中,并作为依赖项注入并在对象公共接口实现中使用。这是更“可测试”的方式。

var myActualImplementationTestTheHellOutOfMe = function(s, d) {

    return s*d;

}

(function($, helper) {

  var someHelperFunction = function(s, d) {
    return helper(s, d);
  }
  var someOtherHelperFunction = function(s) {
    return s*2;
  }

// here goes the normal plugin code

})(jQuery, myActualImplementationTestTheHellOutOfMe);

答案 2 :(得分:1)

您可能还想考虑使用JavaScript doctests。我知道有两个实现:Ian Bicking的doctest.js和我自己的doctest

答案 3 :(得分:0)

帮助程序的作用域是插件内部,这是一个匿名函数,您无法访问其中声明的变量。
如果要对其进行测试,请将var关键字放在函数前面。这将把函数声明为全局(将它们附加到窗口对象),使它们能够从窗口范围中看到(通过调用someHelperFunctionwindow.someHelperFunction)。 所以,为了测试:

(function($) {
    someHelperFunction = function(s, d) {
        return s*d;
    }
    someOtherHelperFunction = function(s) {
        return s*2;
    }
     // here goes the normal plugin code
})(jQuery);

测试结束后,再次添加var关键字。

<强>更新
 我认为更好的方法是将可测试函数分组到一个对象中 - 并构造一个api。然后,根据相同的原则,您可以在全局范围内使api可见:

(function($, global) {
    someHelperFunction = function(s, d) {
        return s*d;
    }
    someOtherHelperFunction = function(s) {
        return s*2;
    }

    var api = {
        someHelperFunction: someHelperFunction,
        someOtherHelperFunction: someOtherHelperFunction
    };

    // decide whether you want to expose your api or not 
    if(makeGlobal) {
        global.api = api;
    }
})(jQuery, this);

答案 4 :(得分:-3)

查看qunit,一个JavaScript单元测试库