2012-02-01 12 views
1

所以,我試圖讓我的頭腦如何編寫可測試的代碼,並且正在玩一個.srt(字幕)播放器的項目。可測試的代碼 - 我做對了嗎?

我有一個類Player,它有屬性框架和sourcePath。

我有一個方法loadFrames(),我通常會寫,只是打開在sourcePath找到的文件,解析它,並相應地填充框架。

但是 - 我想能夠測試這個。我想避免不得不調用文件系統 - 我希望能夠定義sourcePath中'文件'的內容在我的測試中。

我這樣做的方式是使方法loadFrames採用一個類型爲IFileLoader的參數,它有一個方法String [] GetSourceText(String source);

生產中使用的真正FileLoader將解析在源文件中找到的文件。在我的測試中,我使用了一個FakeFileLoader,它返回我設置的內容屬性的值。

所以 - 我的問題是 - 我是否以良好的方式做到這一點。它不像我通常寫代碼的方式。編寫可測試的代碼當然似乎感覺與我習慣的不同,雖然這滿足了我當前的要求,可以指定源代碼的內容 - 我想知道我做過的方式是否合乎邏輯。是否有更好,更明智的方式來達到同樣的效果?

非常感謝所有幫助和見解!

P.S我沒有使用任何模擬框架等,只是普通的代碼。我實際上是用C#編寫的,我從來沒有做過(通常是Java),但我當然認爲這是一個通用的測試問題,而不是針對任何一種語言。

回答

0

到目前爲止,這麼好。如果您的測試保持簡潔而有用,則無需選擇模擬框架。

除此之外,IMO的「正確的」測試驅動編程正以這樣的方式工作,讓您從寶貴的期望開始,並以實際的,完全可測試的代碼結束。或者簡單地說,從外面工作。相反,「錯誤」始於不明確的期望,並以許多不必要的,脆弱的和錯誤的代碼結束。

0

如果方法loadFrames()原本沒有參數,那麼最好避免添加一個參數。而是創建一個工廠方法,該方法返回IFileLoader類型的對象,並使用該工廠方法代替參數。

然後爲了測試創建一個Player的子類,比如TestPlayer,返回測試IFileLoader

我也推薦使用模擬框架。

這聽起來像你正在向遺留代碼添加測試。如果是這樣,我建議書「與遺留代碼有效地合作」,討論將測試添加到現有代碼中。

+0

我沒有使用遺留代碼 - 這是一個個人項目 - 非常小,我希望獲得的很大一部分是提高我對可測試代碼的理解。目前爲止只有很少的代碼存在。 – QuakerOat 2012-02-01 02:08:23