Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript模块模式-如何显示所有方法?_Javascript_Unit Testing_Tdd_Module Pattern - Fatal编程技术网

Javascript模块模式-如何显示所有方法?

Javascript模块模式-如何显示所有方法?,javascript,unit-testing,tdd,module-pattern,Javascript,Unit Testing,Tdd,Module Pattern,我的模块模式是这样做的: var A = (function(x) { var methodA = function() { ... } var methodB = function() { ... } var methodC = function() { ... } ... ... return { methA: methodA, methB: methodB } })(window) 这个代码让我只调用methA和methB

我的模块模式是这样做的:

var A = (function(x) {
   var methodA = function() { ... }
   var methodB = function() { ... }
   var methodC = function() { ... }
   ...
   ...
   return {
      methA: methodA,
      methB: methodB
   }
})(window)
这个代码让我只调用methA和
methB()
on
A
,这就是我想要的和喜欢的。现在我遇到的问题是-我想不费吹灰之力地对它进行单元测试,至少不费吹灰之力


首先我想我可以简单地返回
这个
,但我错了。它返回
窗口
对象。(有人能解释一下原因吗?)

Second-我在网上的某个地方找到了解决方案-将此方法包含在我的返回块中:

__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.。\uu exec('methA',arguments)
这几乎是我想要的,但相当难看。我更喜欢
A.test.methA()
其中
test
永远不会在生产代码中使用-只是为了显示私有方法


编辑 我看到有人告诉我测试大的东西而不是小的部分。让我解释一下。在我看来,API应该只显示所需的方法,而不是一堆内部函数。由于内部结构尺寸小,功能有限,因此测试起来要容易得多,然后再测试整个系统,猜测哪个部分出了问题


虽然我可能错了,但我仍然希望看到如何从对象本身返回对所有方法的引用:)。

为什么不使用名称空间将模块和公共方法添加到js引擎中呢。像这样:

window['MyApp']['MODULE1'] = { "METHOD1" : {}, "METHOD2" : {}}; 
我写这样的模块

然后像这样测试它:


使用eval()通常不是一个好主意。

回答您的第一个问题(您返回这个,但它返回的是窗口,而不是您想要的对象):在javascript
中,这个
函数内部返回全局对象,除非该函数是对象的方法

考虑下面的例子:

1)
指向全局对象():

2)
指向对象:

var obj = {
    value: "foo",
    getThisObject: function(){
        return this;
    }
}
您的案例是示例#1,因为您有一个返回对象的函数。此函数不是任何对象的方法

第二个问题的最佳答案是只测试公共方法,但如果 这对你们来说非常重要,我可以提出以下建议:

在服务器端动态创建模块

工作原理:

  • 为您想要的功能创建单独的脚本
  • 为这些单独的脚本创建测试
  • 创建一个方法,该方法将根据需要将脚本组合成一个脚本
  • 要加载脚本,请参考合并脚本方法

希望它能解决你的问题。祝你好运

您不需要对私有方法进行单元测试,也不需要将它们私有化。这很简单。@mpm私有方法也是代码,所以它们也需要测试。这不是个好主意。私有方法是私有的,您不必公开它们。测试你的公共方法,它们依赖于私有方法,所以测试公共方法也应该包括这一点。可能重复@lukas.pukenis然后将其公开,这有什么复杂的?如果您想访问某个内容,请将其公开。你不想让它成为私人的。您可以使用合成将另一个对象中的某些内容设置为公共-私有。我不明白这里有什么问题。你不能两全其美,仅此而已。正如另一个问题(上)所述,TDD是关于测试合同的。TDD不关心隐私。您可能对eval()是正确的,但我看不出有什么问题。这是一种语言结构,在某些情况下会有所帮助。
var obj = {
    value: "foo",
    getThisObject: function(){
        return this;
    }
}