[英]Create File During Unit Test - Can't Open it to Write - TestDriven.Net and NUnit
我正在測試一些需要使用FileInfo和DirectoryInfo對象的代碼,而不是寫一個包裝器和幾個接口來解決這個問題,我認為在開始測試時創建一些文件然后刪除那些文件是個好主意。測試完成。 這是我創建文件的方式:
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竊取鎖? 我應該以不同方式創建此文件嗎? 我應該以其他方式編寫測試嗎?
在此先感謝您的答案和評論=)。
編輯:
要解決這個特定的問題 (真正的問題,正如Dave Swersky提到的那樣,單元測試不應該接觸文件系統)我使用James Wiseman發送的鏈接(再次感謝James =)並使用FileShare標志創建文件,這樣我可以進入文件,打開它寫入它。 像這樣:
using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))
有了它,我可以打開並寫入文件。 =)
這可能不是您正在尋找的答案,但這正是您應該使用模擬而不是實際創建文件的原因。
這是一個用於模擬文件系統的現成解決方案: http : //bugsquash.blogspot.com/2008/03/injectable-file-adapters.html
我注意到你直接使用FileStream
對象來執行寫操作。
如果您創建StreamWriter
對象,並將其用於文件操作(包括關閉),是否會出現同樣的問題?
谷歌搜索出現了這篇文章。 你會發現它很有用。 http://foson.blogspot.com/2007/10/closing-filestream-and-streamwriter-and.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.