我們正在嘗試使用TDD來創建我們的系統,並且我們遇到了一個我們無法弄清楚正確的TDD行動方案的情況。TDD - 如何測試.Read()沒有.Write()?
我們已經隱藏文件IO接口後,像這樣:
public interface IFileIo
{
byte[] Read(string fileName);
void Write(string filename, byte[] data);
}
,現在我們正在創建一個InMemoryFileIo
,我們可以代替真正的SystemFileIo
類,我們將使用生產使用。
我們希望確保這個InMemoryFileIo
正常工作,並且可能有些情況下我們想用它來代替實際的文件系統,所以它應該是「生產質量」。
問題是,做所有「正確的TDD方式」,我們如何創建一個測試.Read()
或.Write()
他們不相互依賴?
爲了測試這工作正常,我們會需要.Read()
成功地打了一個電話給.Write()
第一,同樣,來測試.Write()
工作正常,我們會再需要調用.Read()
之後。通過這樣做,我們實際上創建了兩次相同的測試(安排,然後寫入,然後讀取,然後斷言)。
可以說我們有兩個測試,一個測試.Read()
,另一個測試.Write()
。如果其中任何一個功能都不起作用,那麼這兩個測試都會失敗。這違反了「一個測試應該只有一個失敗原因」的原則。
這裏的例子是文件IO,但是當使用數據庫時測試put
沒有get
這個問題。
在這種情況下沒問題,只是一起測試它們 - 如果失敗,則意味着另一個失敗,並且測試中的錯誤消息會告訴您哪一個失敗。不要反套,也不要試圖使用任何模擬思考的東西 - 它在同一個單元內,這是有道理的。 –
對於InMemoryFileIo而言,「正確」的方式(再次擔心它)將在其構造函數中使用byte []而不是創建它(依賴注入),這將允許您預先設置數據讀取或運行對彼此外部編寫的數據的檢查 - 實際上,不要過度考慮這一點 - 只需編寫對您有意義的測試,並幫助您明確識別系統中的缺陷。 –
我認爲值得指出的是,如果你的內存IO類只是作爲測試的雙倍使用,它應該足夠簡單,不需要進行大量的測試。重點是假的其他類你TDDing取決於接口的權利?耦合他們的傳遞或不通過測試,以確定您的內存中的文件IO假是否無缺陷似乎對我來說可能是一個壞主意。我建議讓你的存根很簡單。 – kai