我有这样的模块模式:
var A = (function(x) {
var methodA = function() { ... }
var methodB = function() { ... }
var methodC = function() { ... }
...
...
return {
methA: methodA,
methB: methodB
}
})(window)
这段代码让我只调用 methA ,methB()
这A
就是我想要的和我喜欢的。现在我遇到的问题 -我想至少以最小的努力对它进行单元测试而没有痛苦。
首先,我虽然可以简单地返回this
,但我错了。它返回window
对象。(有人可以解释为什么吗?)。
其次- 我在网上的某个地方找到了解决方案 - 将此方法包含在我的返回块中:
__exec: function() {
var re = /(\(\))$/,
args = [].slice.call(arguments),
name = args.shift(),
is_method = re.test(name),
name = name.replace(re, ''),
target = eval(name);
return is_method ? target.apply(this, args) : target;
}
这个方法让我这样称呼方法:A.__exec('methA', arguments);
这几乎是我想要的,但很丑陋。我更喜欢A.test.methA()
wheretest
永远不会在生产代码中使用 - 只是为了揭示私有方法。
编辑 我看到人们告诉我要测试大的东西而不是小部分。让我解释。在我看来,API 应该只显示所需的方法,而不是一堆内部函数。由于它们的小尺寸和有限的功能,内部结构更容易测试,然后测试整个事物并猜测哪个部分出了问题。
虽然我可能错了,但我仍然想看看如何从对象本身返回对所有方法的引用:)。