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它本质上是匿名执行的外部函数的私有成员,所以它似乎不是从外部可测试的.
您可以故意将测试挂钩暴露给外部世界,就像这样:
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.如果私有成员更改(或依赖)其主机/父功能的状态,则更难以对其进行单元测试,因为您必须同时重新创建或人为控制主机/父状态如上所述,这些钩子必须手动添加
如果你真的很聪明,你可以让你的构建过程查找上面的注释块,并在创建生成构建时删除测试钩子.
我认为我对此的回答是(就像很多事情一样)我做错了。我所定义的“私有”函数确实需要测试。它只是私有的,因为我不想在实用程序 api 或类似的东西中公开它。但它仍然可以通过我的应用程序命名空间公开。
因此,在 dom-ready 上执行的匿名函数中,我只需将预定义函数作为事件处理程序附加到正确的 DOM 挂钩。这些函数本身虽然没有与我的更开放的实用程序函数一起存储,但仍然公开存储在我的命名空间中的一个包中,与它们正在处理的 DOM 结构相关联。这样我就可以得到它们并适当地测试它们。