【发布时间】: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.Create和File.Delete方法效果更好。 -
您还可以检查该目录是否为只读目录,因为它通常是 VS 放置已编译可执行文件的位置。
-
@AnnL。您介意扩展如何在测试中使用设置类吗?我在测试类中实现了这个类,我还需要对各个测试做些什么吗?
-
对不起,我花了这么长时间才回复你。你还有困难吗?
标签: c# unit-testing tdd xunit