在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,以便能够对它进行单元测试, 那可能吗?
答案 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
关键字放在函数前面。这将把函数声明为全局(将它们附加到窗口对象),使它们能够从窗口范围中看到(通过调用someHelperFunction
或window.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单元测试库