如何使用xunit中的File.Create()和File.Delete()方法测试函数?

时间:2017-01-19 16:34:19

标签: c# unit-testing tdd xunit

我没有编写太久的代码,如果不能很好地表达,那就道歉了。

所以,我一直在尝试使用构造函数和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框架中的文件的创建和删除,以便测试始终如一?你能用我写这个的方式指出任何明显的错误吗?

1 个答案:

答案 0 :(得分:2)

您描述的行为意味着您在两次测试之间保留文件句柄。我建议你仔细检查你的设置和拆解是否有效,因为看起来你做错了(在每次测试之前和之后都没有调用它们)。

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