Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多文件删除方法单元测试成功_C#_Unit Testing_Dependency Injection_Nunit_Moq - Fatal编程技术网

C# 多文件删除方法单元测试成功

C# 多文件删除方法单元测试成功,c#,unit-testing,dependency-injection,nunit,moq,C#,Unit Testing,Dependency Injection,Nunit,Moq,我最近问了一个问题,但没有得到一个我可以采取行动的答案。我认为这是由于包含了很长的代码示例。我决定用一个小得多的代码示例发布另一个问题。我想对下面的方法进行单元测试,以确保它能够工作,并确保它删除指定目录中的所有.xml文件 private static void DeleteXmlFiles(string XmlFileDirectory) { foreach (var file in Directory.GetFiles(XmlFileDirectory, "*.Xml"))

我最近问了一个问题,但没有得到一个我可以采取行动的答案。我认为这是由于包含了很长的代码示例。我决定用一个小得多的代码示例发布另一个问题。我想对下面的方法进行单元测试,以确保它能够工作,并确保它删除指定目录中的所有.xml文件

private static void DeleteXmlFiles(string XmlFileDirectory)
{
    foreach (var file in Directory.GetFiles(XmlFileDirectory, "*.Xml"))
    {
        File.Delete(file);
    }
}
有没有人有任何单元测试代码片段可以让我看看,在这种情况下对我有帮助

以下是我在测试方法中的全部内容,基本上不多:

[Test]
public void can_delete_all_files_from_specified_directory()
{
    string inputDir = @"C:\TestFiles\";
    var sut = new FilesUtility();
    var deleteSuccess = sut.
}

此类测试的一种方法可能是:

  • 创建目录(文件夹)(在单元测试程序集文件夹中)
  • 将一些xml文件粘贴到其中(您可以从单元测试程序集文件夹中的另一个文件夹复制thwem)
  • 调用应该删除它们的方法
  • 看看他们是否走了。 A.如果是,报告成功, B如果没有,请报告失败
  • 删除在步骤1中创建的文件夹
  • 为了单元测试您的方法,您应该单独测试它。也就是说,不应该有任何真正的类,比如SUT与之交互的
    目录
    文件
    。因此,您有三种选择:

    • 创建类所依赖的抽象,并为测试模拟该抽象(Moq将这样做)
    • 模拟静态试验方法。Moq在这里帮不上忙,但这是可能的,等等
    • 进行验收或集成测试而不是单元测试(有利于编写验收测试)
    最后一种方法非常简单——在每次测试运行之前创建新文件夹,并在测试运行之后删除它

    private string path =  @"C:\TestFiles\";
    
    [SetUp]
    public void Setup()
    {
        Directory.CreateDirectory(path);        
    }
    
    [TearDown]
    public void Deardown()
    {
         Directory.Delete(path);
    }
    
    [Test]
    public void ShouldRemoveAllFilesFromSpecifiedDirectory()
    {
        // seed directory with sample files
        FileUtility.DeleteXmlFiles(path);
        Assert.False(Directory.EnumerateFiles(path).Any());
    }
    

    没有办法用Moq或任何其他免费模拟框架来测试这些方法。这是因为他们不能模拟除虚拟或接口实现之外的方法(这在幕后基本相同)

    要伪造(而非模拟)系统方法,如
    File.Delete(…)
    或任何类型的静态方法,您需要类似于Typemock(商业)或MS Moles(不是非常用户友好)的东西


    作为一种解决方法,您可以在测试中创建一个测试目录和一些文件,在其中调用
    DeleteXmlFiles(…)
    ,然后检查目录是否为空。但这会很慢,而且也不是真正的单元测试,更像是集成测试。

    Hi Sergey。谢谢你的回答。我理解你的方法,我想我将不得不使用最后一种方法——只有一件事:如何使用示例文件为目录种子。这可能是显而易见的,但我不确定。这是文件的手动复制粘贴吗?非常感谢。@Jetnor有几种可能性-最简单的方法是使用
    foreach(新[]{“foo.xml”,“bar.txt”}文件中的变量名)创建文件。创建(Path.Combine(Path,name)).Dispose()
    您还可以使用
    Path.GetRandomFileName()
    生成随机文件名,或者您可以将现有示例文件复制到目录中感谢您的帮助Sergey。