我有一個輸出簡單報告文件的類。它從XML文件讀取一些記錄ID號碼:每個用於查找存儲在數據庫中的匹配記錄。然後將每條記錄的詳細信息寫入CSV文件。單元測試使用文件系統的類
我想知道 - 什麼是最好的方式來組織它,以便它很容易測試,但遵循封裝的原則?我認爲最好避免與文件系統交互,除非絕對必要,所以我正在處理Stream對象。單元測試時,我可以使用部分模擬對象來覆蓋讀取或寫入文件的位。
我也不確定何時/何地處理流而不會使單元測試變得棘手。看起來我可能不得不將這些流暴露給單元測試。
我的項目使用NHibernate進行數據訪問,Spring .NET進行依賴注入,Rhino.Mocks進行單元測試。
目前我有一些與此類似:
public class ReportBiz
{
//Access to repository, populated by Spring
internal ICardRequestDAO CardRequestData { get;set;}
//This normally returns a FileStream containing data from the XML file. When testing this is overridden by using a Rhino.Mocks partial mock and returns a MemoryStream
internal virtual Stream GetSourceStream()
{
//Load file and return a Stream
...
}
//This normally returns a FileStream where CSV data is saved. When testing this is overridden by using a Rhino.Mocks partial mock and returns a MemoryStream
internal virtual Stream GetOutputStream()
{
//Create file where CSV data gets saved and return a Stream
...
}
public void CreateReportFile()
{
Stream sourceStream = GetSourceStream();
...
//Create an XmlDocument instance using the stream
//For each XML element, get the corresponding record from the database
//Add record data to CSV stream
...
}
}
它會更好使用某種自定義的工廠或東西和流傳入構造?但是如果涉及到一些商業邏輯,如何呢?文件名是根據查詢結果確定的?
或者是整個文件訪問的東西不是問題?
道歉,如果我失去了明顯的東西。我會很感激任何建議。
我需要問:你的XML是做什麼的?它是否只包含指向數據庫記錄的密鑰列表? – 2010-02-11 16:46:02
除了數據庫密鑰外,它還包含我需要的三個與記錄相關的其他字段。這些也被用在報告中。 – James 2010-02-11 16:52:55
相關:http://stackoverflow.com/questions/129036/unit-testing-code-with-a-file-system-dependency – 2010-02-11 16:58:44