我在編寫需要解析XML文檔的類時嘗試使用TDD。假設這個類叫XMLParser,它的構造函數接受一個字符串作爲解析XML文件的路徑。我想有一個Load()方法,試圖將這個XML加載到內存中,並對文件執行一些檢查,例如文件系統錯誤,不管它是否是XML文件等。在TDD中測試私有方法的替代
我的問題是關於替代方案:我已經讀過,你需要測試私有方法是不好的做法,並且你應該能夠測試公共接口並讓私有方法完成它們的工作。但在這種情況下,此功能非常重要,我認爲它不應該公開。
有沒有人對此類情景有很好的建議?
我在編寫需要解析XML文檔的類時嘗試使用TDD。假設這個類叫XMLParser,它的構造函數接受一個字符串作爲解析XML文件的路徑。我想有一個Load()方法,試圖將這個XML加載到內存中,並對文件執行一些檢查,例如文件系統錯誤,不管它是否是XML文件等。在TDD中測試私有方法的替代
我的問題是關於替代方案:我已經讀過,你需要測試私有方法是不好的做法,並且你應該能夠測試公共接口並讓私有方法完成它們的工作。但在這種情況下,此功能非常重要,我認爲它不應該公開。
有沒有人對此類情景有很好的建議?
我建議重新設計一下你的架構。目前,您有一個嵌入了低級功能的高級課程。將它分解爲屬於不同圖層的多個類(我在此使用的術語「圖層」非常鬆散)。
例子:
現在您可以獨立測試所有這三個類了!
您將看到您的高級課程不會比僅僅編寫兩個低級課程更多。
不使用訪問修飾符(下一個私有修飾符),並將測試寫入同一個包中。
良好的OOD很重要,但對於真正重要的功能測試更重要。好的做法總是隻是一個指導方針,在一般情況下它們是好的。
您也可以嘗試在另一個對象中封裝特定的文件檢查行爲,讓您的解析器實例化並使用它。這可能是我會做的。通過這種方式,您甚至可以在最小的努力下在其他地方使用此功能。
您可以創建一個子類作爲測試包的一部分,將公共訪問器公開給私有方法(應該受到保護)。
Public class TestableClass : MyClass
{
public someReturnType TestMethod() {
return base.PrivateMethod();
}
}
謝謝丹尼爾。你能詳細說明#1嗎?我喜歡將#2和#3這些任務轉換爲可測試但分開的課程。 – Monochrome 2012-01-07 00:26:32
@單色:我不太瞭解你評論中的問題。這三點不是「兩個或者兩個」選項,你需要一起使用它們。話雖如此,第一步還不清楚嗎? – 2012-01-08 15:03:27