在匿名函数中测试JavaScript函数

Mat*_*lor 8 javascript testing

可以在myInnerFunction下面测试吗?

var val = function() {
    var myInnerfunction = function(input) {
        return input + ' I ADDED THIS';
    };
    return myInnerfunction('test value');
}();
Run Code Online (Sandbox Code Playgroud)

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

Kyl*_*son 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');
}();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Mat*_*lor 1

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

因此,在 dom-ready 上执行的匿名函数中,我只需将预定义函数作为事件处理程序附加到正确的 DOM 挂钩。这些函数本身虽然没有与我的更开放的实用程序函数一起存储,但仍然公开存储在我的命名空间中的一个包中,与它们正在处理的 DOM 结构相关联。这样我就可以得到它们并适当地测试它们。