2012-09-06 129 views
1

這種共識似乎不是在TDD時測試私有方法。TDD重複聲明

Should Private/Protected methods be under unit test?

我不停的按這個相同的情況。我有一個私有方法(例如它將所有選項切換爲關閉)。它改變了很多狀態,並被一些公共方法調用。無論調用哪些公用方法(所有選項都設置爲off),私有方法對狀態所做的更改將保持不變。

什麼是最好的方式來測試這個私有方法的功能,而無需添加許多有效地做同樣事情的測試?

btw,我正在使用QUnit來測試Javascript對象。

這是我的課程的過於簡化的版本。

http://jsfiddle.net/twistedinferno/UMgAx/

編輯

什麼我真的想在這裏問是不是「我不應該或者我應該測試私有方法」作爲已經回答這個問題的答案是否定的。我想知道如何最好地測試每個公共方法,因爲使用我的私有方法會導致許多斷言相同。相同的私有方法被許多公共方法調用。可以有很多重複的斷言來測試當許多公共方法中的每一個調用我的私有方法時發生的狀態變化嗎?

新撥弄測試 http://jsfiddle.net/twistedinferno/JHzWh/

回答

4

測試的公共方法。

或者更一般地說,測試物體的向外可見界面。

如果公用方法使用私有方法,則將使用它的使用作爲結果。但私有方法本身不屬於該對象之外的其他任何東西,包括測試。

這些測試不應該知道或關心這樣的私有方法是否存在,更不用說他們是否正在測試它。他們應該測試所有的公共功能。

如果許多測試都在做同樣的事情,那麼這可能表明公共功能中有不必要的重疊?也許有重新考慮的空間嗎?當然,這完全是猜測而沒有看到任何代碼。你能提供一個例子嗎?

編輯

附加斷言重複相同的按鍵,但測試是完全不同的,因爲它們正在測試不同的朝外的功能。您始終可以將重複的斷言重構爲每個測試調用的單個函數。自定義聚合斷言的排序。只要公共方法繼續具有相同的可觀察(可測試)行爲,那就沒有問題。一旦發生變化,其測試當然也需要改變。

+0

這裏是一個過於簡化的小提琴http://jsfiddle.net/twistedinferno/UMgAx/我的真實事例證明過大增加或過於複雜凝結。公共功能肯定存在重疊,但我不確定該怎麼做。 – orangesherbert

+0

@TwistedInferno:在這個例子中,它看起來像你打算測試的是後面三個函數,而第一個函數是私有函數? (誠​​然,我不熟悉JavaScript對象。)對於外部觀察者來說,私有函數甚至存在並不重要。三個公衆測試。他們都在內部使用相同的私人功能這一事實對測試並不重要。 (事實上​​,該測試也可以有一個共享的私有函數來驗證普遍預期的業績。) – David

+0

燁,用下劃線的方式是私人的,那些沒有是公共的(只是一個約定,另一個選項是關閉其效率較低在內存方面)。所有的燈都是公開的。好的,所以我應該爲每個公共方法的每個亮度值包含四個斷言? (即4 x 3斷言)對我來說是重複測試,感覺不太對。 – orangesherbert

2

既然你正在練習TDD中,我推測,在有問題的私有方法的每一行代碼就不會在缺乏所需它被寫入測試的存在。這意味着不需要獨立於公共接口來測試私人功能。

謝謝!

布蘭登

+0

非常感謝您的意見,但我不確定是否遵循。即使沒有專門的測試測試,私有方法也會存在。擁有私有方法的原因是封裝類似的行爲並刪除重複的代碼。我同意,我不需要獨立測試私有方法,但是我的問題是每個公共方法在每個測試中都有許多完全相同的斷言,並且由於我多次重複斷言,所以感覺不太正確。 – orangesherbert

1

我同意bcariso和大衛。你不應該測試,也不應該測試私有方法。

有一點需要注意的是,如果你的私有方法是如此大,重要的是,你覺得你必須測試它,你應該考慮提取它是它自己的助手類的公共方法。

在Javascript中,同樣的原則站立,只有你會使其公開可見的功能或模塊(如果您使用的模式)。

+0

謝謝阿薩夫,這不是說我的私人方法如此之大,它只是重複行爲,因此我需要重複測試。 – orangesherbert

+0

在這種情況下,我認爲這是一個明確的信號,您應該將它作爲一個完全公共的函數,因爲它被重用。 –

+0

謝謝阿薩夫。它只重複班級內部的行爲,所以我不確定是否公開會是一個好主意;私人方法不需要公開。也許你可以儘管細說...... – orangesherbert