【问题标题】:How to test functions using File.Create() and File.Delete() methods in xunit?如何在 xunit 中使用 File.Create() 和 File.Delete() 方法测试函数?
【发布时间】:2017-06-04 11:00:52
【问题描述】:

我很久没有写代码了,如果表达得不好,敬请见谅。

所以,我一直在尝试使用构造函数和IDisposable,以便在 xunit 中编写单元测试来测试与创建和删除文件相关的一些功能。最初我开始编写没有任何“setup”/“teardown”等价物的测试,但我遇到了第一次运行测试通过的问题,但第二次失败,因为我正在测试的文件可能被删除已经被删除了上一个运行测试的实例!所以,现在我试图在我的构造函数中包含 'File.Create("file-path")', 'File.Delete("file-path")' 类型的方法,但发现我的测试一旦中断我采用了其中一种方法。 'Directory.CreateDirectory()' 或 'Directory.Delete()' 不会发生这种情况。

举例来说,这是我一直在尝试使用构造函数的那种事情的示例...

 public class SetUp : IDisposable
{  
    protected SetUp() 
    {
        Directory.CreateDirectory(@"c:\Projects\Tests\Test");
        File.Create(@"c:\Projects\Tests\test.txt");
    }

    public void Dispose()
    {
        Directory.Delete(@"c:\Projects\Tests\Test", true);
        File.Delete(@"c:\Projects\Tests\test.txt");
    }
}

这对于以下测试是必要的:

[Theory]
    [InlineDataAttribute(@"c:\Projects\Tests\test3.txt")]
    public void CanRemoveFile(string filePath)
    {
        //Assign
        var myInstanceOfApphelper = new AppHelper();
        bool fileExists = true;
        //Act
        myInstanceOfApphelper.RemoveFile(filePath);
        fileExists = myInstanceOfApphelper.CheckFileExists(filePath);
        //Assert
        Assert.Equal(false, fileExists);
    }

...因为在运行测试之前没有这个构造函数部分来创建文件,所以下次我运行测试时,该位置将没有文件可以删除,它会失败。但是,只要我包含 File.Create(@"c:\Projects\Tests\test.txt"); 行,我的所有测试都会中断。我返回的错误都是

"进程无法访问文件'c:\Projects\Tests\test.txt' 因为它正被另一个进程使用。”

但我无法理解这一点,因为大多数测试都不使用 'c:\Projects\Tests\test.txt!

谁能告诉我为什么这不起作用?我如何才能在测试始终通过的情况下测试 xunit 框架中文件的创建和删除?你能指出我写这篇文章的方式有什么明显的错误吗?

【问题讨论】:

  • 你如何使用你的Setup类?我没有看到您实际上在测试中使用它。
  • 我有时会遇到类似的问题。我发现使用System.IO.FileInfo 对象创建和删除文件比使用静态File.CreateFile.Delete 方法效果更好。
  • 您还可以检查该目录是否为只读目录,因为它通常是 VS 放置已编译可执行文件的位置。
  • @AnnL。您介意扩展如何在测试中使用设置类吗?我在测试类中实现了这个类,我还需要对各个测试做些什么吗?
  • 对不起,我花了这么长时间才回复你。你还有困难吗?

标签: c# unit-testing tdd xunit


【解决方案1】:

您描述的行为意味着您在两次测试之间保留文件的句柄。我建议您仔细检查您的设置和拆卸的工作方式,因为您似乎做错了(不是在每次测试之前和之后都调用它们)。

奖励:我建议在进行单元测试时不要使用真实的文件系统。内存中的文件系统可以完全清理您的工作空间,并确保您不受物理文件系统的困扰。 例如检查:https://github.com/bobvanderlinden/sharpfilesystem

【讨论】:

  • 如果这是一个非常简单的问题,请原谅我,但是您能否为我指出正确的方向,以了解如何在测试中调用设置和拆卸?目前,我正在我的测试类中实现 SetUp,但是对于每个使用 setup 和 teardown 的单独测试什么都不做。在我能找到的示例中,我看不到任何明显的说明如何做到这一点!
  • 在 xunit 中,设置在类构造函数中完成,而拆卸在 dispose 方法中完成(实现 IDisposable)。他们的文档非常清楚,他们不鼓励设置和拆卸原则。我不同意,但这是我自己的看法。我更喜欢使用功能更强大的 Nunit。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 2021-01-05
  • 2021-06-16
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
相关资源
最近更新 更多