2013-03-18 23 views
2

我有这样做模块模式:Javascript模块模式 - 如何显示所有方法?

var A = (function(x) { 
    var methodA = function() { ... } 
    var methodB = function() { ... } 
    var methodC = function() { ... } 
    ... 
    ... 
    return { 
     methA: methodA, 
     methB: methodB 
    } 
})(window) 

此代码让我们来找我只梅塔和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()test永远不会用于生产代码 - 只是为了揭示私有方法。


编辑 我看到人们告诉我测试,而不是一小部分的一件大事。让我解释。在我看来,API应该只揭示所需的方法,而不是一堆内部函数。内部因为体积小和功能有限而更容易测试,然后测试整个事情并猜测哪个部分出了问题。

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

+4

你不单位测试私人方法,或者你不要让他们私人。这很简单。 – mpm 2013-03-18 15:33:34

+1

@mpm私有方法也是代码,因此它们也需要进行测试。 – 2013-03-18 15:34:16

+2

这不是个好主意。私人方法是私人的,你不必公开它们。测试你的公共方法,他们依赖于私人测试,公众也应该覆盖这一点。 – dfsq 2013-03-18 15:35:12

回答

0

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

window['MyApp']['MODULE1'] = { "METHOD1" : {}, "METHOD2" : {}}; 

我写这样的模块Sample module in JavaScript

而且这样的测试:Simple unit testing in JavaScript

使用eval()一般不会好主意。

+0

你可能是eval()的权利,但我没有看到它的问题。这是一种语言结构,有助于在某些情况下。 – 2013-03-19 08:50:14

2

回答你的第一个问题(返回这一点,但它返回的窗口,而不是你想要的对象):在JavaScript this里面的函数返回全局对象,除非这功能是对象的一个​​方法。

考虑下面的例子:

1)this指向全局对象():

function(){ 
    return this; 
} 

2)this指向的对象:

var obj = { 
    value: "foo", 
    getThisObject: function(){ 
     return this; 
    } 
} 

你的情况下是例如# 1,因为你有一个函数,返回一个对象。这个函数不是任何对象的方法。

的最佳答案你第二问题是测试唯一的公共方法,但如果 是对你那么重要,我可以下一个建议:

在服务器端动态创建的模块。

工作原理:

  • 创造你想要的功能,单独的脚本;
  • 为这些独立的脚本创建测试;
  • 创建方法,将脚本合并到一个不管你想要的;
  • 加载脚本,引用组合脚本方法。

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

相关问题