我正在測試一些需要使用FileInfo和DirectoryInfo對象的代碼,而不是編寫一個包裝器和幾個接口來解決這個問題,我認爲在開始測試時創建一些文件是一個好主意,然後在測試完成後刪除這些文件。這是我創建文件的方式:單元測試期間創建文件 - 無法打開它寫 - TestDriven.Net和NUnit
public static void CreateTestSchedules(int quantity)
{
String folder = Path.Combine(Directory.GetCurrentDirectory(), "FolderFiles");
for(int quantity=10; quantity > 0; quantity--)
{
String filename = Path.GetTempFileName();
using (FileStream fileStream = File.Create(Path.Combine(folder, filename)))
{
XDocument fileContent = Helper.CreateContent(filename);
Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(fileContent.ToString());
fileStream.Write(bytes, 0, bytes.Length);
fileStream.Flush();
fileStream.Close();
}
}
}
在這一點上,我沒有看到一個問題:文件夾下創建的,一切都看起來很好。
然後,當測試的執行繼續時,我嘗試打開其中一個文件以在其中寫入內容,並且我得到一個異常,指示我想要打開的文件正在被其他進程使用, ,在詳細檢查之後,我將TestDriven.Net過程視爲阻止文件的過程。這是我用來打開並試圖將數據寫入到文件的代碼:
using (FileStream file = new FileStream(filename, FileMode.Append))
{
Byte[] bytes = ASCIIEncoding.ASCII.GetBytes(dataToWrite.ToString());
if (file.CanWrite)
{
file.Write(bytes, 0, bytes.Length);
}
}
我的問題是:爲什麼會這樣?我沒有正確地釋放文件句柄? TestDriven.Net中有沒有偷走鎖?我應該創建這個文件不同嗎?我應該以其他方式編寫測試嗎?
在此先感謝您的答案和評論=)。
編輯:
爲了解決這一特定問題(真正的問題,戴夫Swersky提到這個問題,是單元測試不應該接觸的文件系統)我用由詹姆斯·懷斯曼發送的鏈接(再次感謝James =)並使用FileShare標誌創建了該文件,這樣我就可以訪問該文件,並打開它以寫入文件。像這樣:
using (FileStream fileStream = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))
因此,我可以打開並寫入文件。 =)
感謝您的答案/發表評論。這篇文章非常有趣,你說得對:我不應該爲此觸及文件系統。正如我所說,我認爲我不會有太大的問題,因爲我正在爲這些文件創建它們(文件),然後將它們刪除。 如果我無法快速解決此問題,我想我將不得不更改我的測試和我的測試代碼。 =) – Hugo 2011-01-12 16:22:31