我正在测试一些需要使用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 =),并用文件展示标志创建了文件,这样我就可以到达文件,将其写入给它。像这样:

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

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

有帮助吗?

解决方案

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

如果创建一个 StreamWriter 对象,并将其用于文件操作(包括关闭)?

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top