2015-04-18 146 views
0

如何以及在哪裏可以創建一個可以在標準Windows 7/8平臺上由每個人使用和創建的文件(在測試中)?最佳實踐C#在測試中創建文件

因爲當我嘗試使用:

Directory.CreateDirectory(TEST_FILE_PATH); 

我有一個UnauthorizedAccessException這樣我就可以改變我的電腦,但其他貢獻者沒有權利對我的權利。

編輯:

好吧,你需要一些細節。我有一個接口,允許我採取流。但在我的測試中,我需要使用一個文件,閱讀並存儲我正在閱讀的內容。所以,我想測試文件中的所有數據是否正確存儲。

例子:

 ICarStorage carStorage = new CarFileStorage(FILE_PATH); 
     List<Car> cars = carStorage.Load(); 
     // array which contains cars wrote in file 
     int expected = CARS.Length; 
     int actual = cars.Count; 
     Assert.AreEqual(expected, actual); 
+1

究竟你的意思是通過測試,單元測試? –

+1

在測試過程中,你是否真的想做涉及物理磁盤的事情?總是有可能因爲你所得到的異常而導致你的測試失敗,這是不理想的... –

+0

好吧,但如何測試文件是否正確加載(如我的加載方法應該)?! @GrantWinney – kaoziun

回答

4

A 「測試」 不應該實際訪問的文件。您的API不應該訪問文件。誰知道,您的用戶可能沒有文件,或者可能不想使用文件,就像您在測試場景中一樣。

您需要一些抽象代表可以讀取或寫入的數據流。在C#中,這被稱爲Stream。然後,您的API的用戶可以決定只使用RAM來傳遞file streammemory stream。甚至是來自套接字的network stream。或者你從未想過的任何其他類型。

+1

到目前爲止它不清楚他正在執行什麼樣的測試,你是對的單元測試,但在其他情況下,這是一個有效的場景 –

+0

@MichaelSander建立一個更好的API是*永遠*有效的方案。你知道.NET框架中的一個方法,如果它不是絕對必須的話,它會採用文件名嗎? Streams是解決這個問題的概念,它只是單元測試發生的地方。 – nvoigt

+1

這是很好的建議,但它不回答這個問題。即使OP決定採用這一建議,未來的遊客可能也想看到實際的答案。 – usr

0

使用臨時文件夾。例如使用Path.GetTempFileName()

1

我仍然不知道什麼最適合您的需求,但我會把它是這樣的:

UnauthorizedAccessException最有可能由不同的上下文中運行的測試引起的,總之,你可能正在使用的路徑並非所有運行測試的用戶都可以訪問。我們假設你只有這個單一文件,並且不想花費很多精力進入框架,那麼你可以創建一個文件名Path.Combine(Path.GetTempPath(), Path.GetTempFileName())

我在更大的應用程序中做了什麼:我永遠不會讓任何人直接訪問文件系統。相反,我有一套通過依賴注入來使用的工具,可以完成所有的文件訪問。因此,我不必在測試中檢查文件,我可以嘲笑它,除了當然文件系統工具的測試。