【发布时间】:2010-05-05 18:31:08
【问题描述】:
在很多框架中,内部函数变量被用作私有变量,例如
Raphael = (function(){
var _private = function(a,b) {return a+b;};
var _public = function(a) {return _private(a,a);}
var object = {mult2:_public};
return object;
})();
这里,我们不能从全局命名空间访问名为private的变量,因为它是第一行匿名函数的内部变量。
有时这个函数包含一个大的 Javascript 框架,所以它不会污染全局命名空间。
我需要对一些内部使用的对象Raphael 进行单元测试(在上面的示例中,我希望对对象private 运行单元测试)。我该如何测试它们?
编辑:我收到了关于单元测试的 cmets,这些单元测试应该测试公共接口。
让我指定一个用例。我正在编写一个名为Raphael 的库。这个库应该只向全局命名空间添加一个名称,仅此而已。这是 Javascript 的特殊要求,因为 Javascript 没有命名空间。
假设Raphael 使用链表。如果 Javascript 有包的概念,我会这样做
require 'linked_list'
Raphael = (function(){/* use linked list */})();
然而 Javascript 不允许我以任何不会污染链表对象的全局范围的方式这样做!因此,我必须将linked_list 内联到 Raphael 的本地范围:
Raphael = (function(){
/* implement linked list */
var linked_list = function(){/*implementation*/};
})();
现在我想测试linked_list 的实现。
【问题讨论】:
-
单元测试背后的想法是仅测试公共功能/方法
-
@Andrey,Javascript 不是你的日常语言!你不能以正常的方式导入其他模块,所以如果我要包含一个小的链接列表实现供 Raphael 使用,它必须内联在 Raphael 的内部函数中,这样它就不会暴露给拉斐尔的使用者。我不能只是
#include它...
标签: javascript unit-testing private-methods