【问题标题】:How to unit test - zipping a file如何进行单元测试 - 压缩文件
【发布时间】:2021-07-02 21:04:46
【问题描述】:

我写了一个简单的方法,它接受一个文件夹的路径,压缩该文件夹内的所有内容,并将其保存到指定的目标路径。

void zipFiles(string sourcePath, string destinationPath, string nameToZipAs)
    {
        try
        {
            // This is where the zip file will be saved.
            string fullDestinationPath = $"{destinationPath}\\{nameToZipAs}";
            ZipFile.CreateFromDirectory(sourcePath, fullDestinationPath);
        }

        catch (Exception e)
        {
            // ...
        }
}        

我想知道如何进行单元测试。我读到单元测试不应该触及文件系统。这是正确的好习惯吗?如果是这样,那么我无法在单元测试中创建一个文件夹(以编程方式),以便用我的方法压缩该文件夹以验证它是否有效。

【问题讨论】:

  • 在这种情况下存在紧密耦合。 ZipFile 将由其开发人员进行广泛的测试。为了测试它与您的代码的交互,您需要进行集成测试。但是要单独测试您的代码,您需要抽象压缩过程。
  • @Nkosi 能否请您在说“抽象压缩过程”时详细说明一下?
  • 您将把静态ZipFile.CreateFromDirectory(sourcePath, fullDestinationPath); 包装在抽象和实现之后,然后将抽象作为显式依赖注入到被测主题中。这将有助于将您的代码与静态实现细节分离,并帮助隔离您的代码。
  • System.IO.Abstractions 可能会有所帮助
  • 模拟框架有两种类型:受约束的和不受约束的。前者:Moq、NSubstitute、FakeItEasy - 只允许您伪造虚拟会员。后者:TypeMock、JustMock、MS Fakes、Prig、Ionad.Fody、Pose、Harmony、MethodRedirect——允许你伪造任何你想要的东西:非虚拟、私有和静态成员、密封类等等。您可以使用它们来模拟 ZipFile.CreateFromDirectory 方法。

标签: c# unit-testing


【解决方案1】:

如果您正确隔离了被测代码,您可以对您的代码使用某些特定参数调用ZipFile.CreateFromDirectory(...) 方法这一事实进行单元测试。如果你有 VS Enterprise,你可以使用MS Fakes。下面的代码显示了一个示例 NUnit 测试(dotnet core 3.1),其中为 System.IO.Compression.ZipFile 添加了 Fakes Assembly):

[Test]
public void ZipFiles_CallsZipFileCreateFromDirectoryWithCorrectArguments()
{
    string sourceDirectoryName = null;
    string destinationArchiveFileName = null;
    using (ShimsContext.Create())
    {
        System.IO.Compression.Fakes.ShimZipFile.CreateFromDirectoryStringString = (arg0, arg1) => {
            sourceDirectoryName = arg0;
            destinationArchiveFileName = arg1;
        };

        zipFiles("source", "dest", "zipname");
    }

    Assert.Multiple(() => {
        Assert.AreEqual("source", sourceDirectoryName);
        Assert.AreEqual("dest\\zipname", destinationArchiveFileName);
    });
}

单元测试项目中的Fakes\System.IO.Compression.ZipFile.fakes 文件应如下所示:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="System.IO.Compression.ZipFile" Version="4.0.5.0"/>
</Fakes>

最后一个我强烈推荐的链接:Unit testing best practices with .NET Core and .NET Standard

【讨论】:

    猜你喜欢
    • 2014-07-28
    • 2014-02-23
    • 2022-07-25
    • 2010-09-18
    • 2011-07-27
    • 2012-06-29
    • 2012-10-22
    • 2012-01-08
    • 2019-11-02
    相关资源
    最近更新 更多