2013-03-18 49 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,因爲你有一個函數,返回一個對象。這個函數不是任何對象的方法。

的最佳答案你第二問題是測試唯一的公共方法,但如果 是對你那麼重要,我可以下一個建議:

在服務器端動態創建的模塊。

工作原理:

  • 創造你想要的功能,單獨的腳本;
  • 爲這些獨立的腳本創建測試;
  • 創建方法,將腳本合併到一個不管你想要的;
  • 加載腳本,引用組合腳本方法。

希望它能解決您的問題。祝你好運!

相關問題