単体テスト中にファイルを作成 - 開いて書き込みできない - TestDriven.Net および NUnit
-
10-10-2019 - |
質問
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();
}
}
}
現時点では、問題は見当たりません。ファイルはフォルダーの下に作成され、すべてが正常に見えます。
次に、テストの実行が続行されるときに、それらのファイルの 1 つを開いて何かを書き込もうとすると、書き込みのために開こうとしているファイルが他のプロセスによって使用されていることを示す例外が発生し、さらに詳しく見ると、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**))
これで、ファイルを開いて書き込むことができます。=)
解決
あなたが使っていることに気づきました FileStream
オブジェクトを直接指定して書き込みを実行します。
を作成した場合にも同じ問題が発生しますか? StreamWriter
オブジェクトを作成し、それをファイル操作 (閉じるなど) に使用しますか?
Googleで検索するとこんな記事が出てきました。役立つかもしれません。http://foson.blogspot.com/2007/10/closed-filestream-and-streamwriter-and.html
他のヒント
これはおそらくあなたが探している答えではありませんが、実際にファイルを作成せずにモックを使用する必要があるのはまさにこれです。
ファイル システムをモックするための既製のソリューションは次のとおりです。 http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html