2012-01-06 74 views
2

我在編寫需要解析XML文檔的類時嘗試使用TDD。假設這個類叫XMLParser,它的構造函數接受一個字符串作爲解析XML文件的路徑。我想有一個Load()方法,試圖將這個XML加載到內存中,並對文件執行一些檢查,例如文件系統錯誤,不管它是否是XML文件等。在TDD中測試私有方法的替代

我的問題是關於替代方案:我已經讀過,你需要測試私有方法是不好的做法,並且你應該能夠測試公共接口並讓私有方法完成它們的工作。但在這種情況下,此功能非常重要,我認爲它不應該公開。

有沒有人對此類情景有很好的建議?

回答

3

我建議重新設計一下你的架構。目前,您有一個嵌入了低級功能的高級課程。將它分解爲屬於不同圖層的多個類(我在此使用的術語「圖層」非常鬆散)。

例子:

  1. 與當前類的公有接口一個類。 ( - >高級層)
  2. 有一個類,負責從磁盤加載文件和處理IO錯誤( - >低層)
  3. 有一類負責驗證XML文檔( - >在它們之間隔)

現在您可以獨立測試所有這三個類了!

您將看到您的高級課程不會比僅僅編寫兩個低級課程更多。

+0

謝謝丹尼爾。你能詳細說明#1嗎?我喜歡將#2和#3這些任務轉換爲可測試但分開的課程。 – Monochrome 2012-01-07 00:26:32

+0

@單色:我不太瞭解你評論中的問題。這三點不是「兩個或者兩個」選項,你需要一起使用它們。話雖如此,第一步還不清楚嗎? – 2012-01-08 15:03:27

1

不使用訪問修飾符(下一個私有修飾符),並將測試寫入同一個包中。

良好的OOD很重要,但對於真正重要的功能測試更重要。好的做法總是隻是一個指導方針,在一般情況下它們是好的。

您也可以嘗試在另一個對象中封裝特定的文件檢查行爲,讓您的解析器實例化並使用它。這可能是我會做的。通過這種方式,您甚至可以在最小的努力下在其他地方使用此功能。

0

您可以創建一個子類作爲測試包的一部分,將公共訪問器公開給私有方法(應該受到保護)。

Public class TestableClass : MyClass 
{ 
    public someReturnType TestMethod() { 
     return base.PrivateMethod(); 
    } 
}