【问题标题】:Create File During Unit Test - Can't Open it to Write - TestDriven.Net and NUnit在单元测试期间创建文件 - 无法打开它来写入 - TestDriven.Net 和 NUnit
【发布时间】:2011-01-12 15:59:37
【问题描述】:

我正在测试一些需要使用 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 窃取锁?我应该以不同的方式创建这些文件吗?我应该以其他方式编写测试吗?

提前感谢您的回答和 cmets =)。

编辑:

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

 using (FileStream fileStream = new FileStream( filename, FileMode.Create, FileAccess.ReadWrite, **FileShare.ReadWrite**))

这样我就可以打开文件并将其写入文件。 =)

【问题讨论】:

    标签: c# unit-testing testdriven.net


    【解决方案1】:

    这可能不是您要寻找的答案,但这正是您应该使用模拟而不是实际创建文件的原因。

    这是一个现成的模拟文件系统的解决方案:http://bugsquash.blogspot.com/2008/03/injectable-file-adapters.html

    【讨论】:

    • 感谢您的回答/评论。这篇文章真的很有趣,你是对的:我不应该为此触及文件系统。正如我所说,我认为我不会有太大的问题,因为我正在为文件创建它们(文件)然后删除它们。如果我不能在这次迭代中快速解决这个问题,我想我将不得不更改我的测试和我的测试代码。 =)
    • 我必须承认我发现 IFile 方法有点烦人。另一个解决方案是systemioabstractions.codeplex.com
    【解决方案2】:

    我注意到您正在直接使用 FileStream 对象来执行写入操作。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-25
      • 2011-10-13
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多