在匿名函数中测试JavaScript函数

时间:2009-12-10 13:46:02

标签: javascript testing

是否可以在下面测试myInnerFunction

var val = function() {
    var myInnerfunction = function(input) {
        return input + ' I ADDED THIS';
    };
    return myInnerfunction('test value');
}();

因为myInnerFunction本质上是匿名执行的外部函数的私有成员,所以它似乎不能从外部测试。

4 个答案:

答案 0 :(得分:5)

您可以故意将测试挂钩暴露给外界,就像这样:

var val = function() {
   var myInnerfunction = function(input) {
      return input + ' I ADDED THIS';
   };
   /* START test hook */
   arguments.callee.__test_inner = myInnerFunction;
   /* END test hook */
   return myInnerfunction('test value');
}();

现在,一旦val运行至少一次,您可以引用val.__test_inner并使用可测试输入调用它。

这种方法的好处: 1.你选择暴露的东西而不是(也是负面的因为你必须记住这样做) 2.你得到的只是对私有方法的复制引用,所以你不能意外地改变它,只使用它并看看它产生了什么

缺点: 1.如果私有成员更改(或依赖)其主机/父功能的状态,则您更难对其进行单元测试,因为您必须同时重新创建或人为控制主机/父状态 2.如上所述,这些钩子必须手动添加

如果你非常聪明,你可以让你的构建过程查找上面的注释块,并在创建生成构建时删除测试钩子。

答案 1 :(得分:1)

afaik单元测试与您测试的内容的内部工作无关。关键是你测试了这个功能,即:它确实它应该做什么不是它做到了。 因此,如果它使用内部私有成员, 应该不可测试...

答案 2 :(得分:1)

您可以测试可观察的外部行为。在这个简单的例子中,你只返回了内部函数的值,但在现实世界的例子中,你可以将内部函数的结果与其他函数结合起来。这个组合是你要测试的,而不是私有方法的直接输出。

尝试测试私有方法将使您的代码难以更改和重构,即使保留了外部行为。也就是说,我喜欢将单元测试视为对代码的广泛测试,而只是提供API的示例以及它在不同条件下的行为方式。 ;)

答案 3 :(得分:1)

我认为我对此的回答(就像很多事情一样)我做错了。我所定义的“私人”功能确实需要进行测试。它只是私有的,因为我不想在实用程序api或类似的东西中公开它。但它仍然可以通过我的应用程序命名空间公开。

因此,在-om-ready上执行的匿名函数中,我只是将预定义的函数作为事件处理程序附加到正确的DOM挂钩。函数本身虽然没有与我更开放的实用程序函数一起存储,但仍然公开存储在与他们正在处理的DOM结构相关联的命名空间中的包中。通过这种方式,我可以对它们进行适当的测试。