【发布时间】:2013-03-07 00:19:30
【问题描述】:
我有这样的模块模式:
var A = (function(x) {
var methodA = function() { ... }
var methodB = function() { ... }
var methodC = function() { ... }
...
...
return {
methA: methodA,
methB: methodB
}
})(window)
这段代码让我在A 上只调用methA 和methB(),这是我想要的和我喜欢的。现在我遇到的问题 - 我想对它进行单元测试,至少不费吹灰之力。
首先虽然我可以简单地返回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(),其中test 永远不会在生产代码中使用——只是为了揭示私有方法。
编辑 我看到人们告诉我要测试大的东西而不是小部分。让我解释。在我看来,API 应该只显示所需的方法,而不是一堆内部函数。内部结构由于体积小且功能有限,因此更容易测试,然后测试整个事物并猜测哪个部分出了问题。
虽然我可能错了,但我仍然想看看如何从对象本身返回对所有方法的引用:)。
【问题讨论】:
-
你没有对私有方法进行单元测试,或者你没有将它们设为私有。这很简单。
-
@mpm 私有方法也是代码,因此也需要对其进行测试。
-
这不是个好主意。私有方法是私有的,你不必将它们公开。测试您的公共方法,它们依赖于私有,因此测试公共也应该涵盖这一点。
-
@lukas.pukenis 然后公开,有什么复杂的?你想访问一些东西,把它公开。你不想然后将其设为私有。您可以使用组合在另一个对象中将某些内容设为公开私有。我不明白这里有什么问题。你不能两全其美,仅此而已。正如另一个问题(上)所述,TDD 是关于测试合同的。 TDD 不关心私有的。
标签: javascript unit-testing tdd module-pattern