在单元测试期间创建文件 - 无法打开它来写入 - TestDriven.Net和NUnit

Hug*_*ugo 5 c# unit-testing testdriven.net

我正在测试一些需要使用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();
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

此时,我没有看到问题:文件在文件夹下创建,一切看起来都很好.

然后,当测试的执行继续时,我尝试打开其中一个文件以在其中写入内容,并且我得到一个异常,指示我要打开以进行写入的文件正被其他进程使用,并且在检查之后更多细节,我将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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么会发生这种情况?我没有正确释放文件句柄?有没有从TestDriven.Net窃取锁?我应该以不同方式创建此文件吗?我应该以其他方式编写测试吗?

在此先感谢您的答案和评论=).

编辑:

解决这个特定的问题(真正的问题,正如Dave Swersky提到的那样,单元测试不应该接触文件系统)我使用James Wiseman发送的链接(再次感谢James =)并使用FileShare标志创建文件,这样我可以进入文件,打开它写入它.像这样:

 using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))
Run Code Online (Sandbox Code Playgroud)

有了它,我可以打开并写入文件.=)

Jam*_*man 1

我注意到您FileStream直接使用该对象来执行写入。

StreamWriter如果您创建一个对象并将其用于文件操作(包括关闭),是否会出现同样的问题?

在谷歌上搜索发现了这篇文章。您可能会发现它很有帮助。 http://foson.blogspot.com/2007/10/ opening-filestream-and-streamwriter-and.html