我正在测试一些需要使用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**))
我可以打开并写入文件。 =)
答案 0 :(得分:2)
这可能不是您正在寻找的答案,但这正是您应该使用模拟而不是实际创建文件的原因。
这是一个用于模拟文件系统的现成解决方案:http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html
答案 1 :(得分:1)
我注意到你直接使用FileStream
对象来执行写作。
如果创建StreamWriter
对象,并将其用于文件操作(包括关闭),是否会出现同样的问题?
Google上的搜索结果显示了这篇文章。你会发现它很有用。 http://foson.blogspot.com/2007/10/closing-filestream-and-streamwriter-and.html