2011-01-12 30 views
5

我正在測試一些需要使用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**)) 

因此,我可以打開並寫入文件。 =)

回答

2

這可能不是你正在尋找的答案,但這正是你應該使用mock而不是實際創建文件的原因。

下面是嘲諷文件系統中的現成的解決方案:http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html

+1

感謝您的答案/發表評論。這篇文章非常有趣,你說得對:我不應該爲此觸及文件系統。正如我所說,我認爲我不會有太大的問題,因爲我正在爲這些文件創建它們(文件),然後將它們刪除。 如果我無法快速解決此問題,我想我將不得不更改我的測試和我的測試代碼。 =) – Hugo 2011-01-12 16:22:31

相關問題