【问题标题】:Unit test method that takes FileInfo as a parameter以 FileInfo 为参数的单元测试方法
【发布时间】:2016-02-09 17:03:15
【问题描述】:

我有一个方法,它以FileInfo 对象作为参数,并检查相应的文件是否以UTF-8 编码。

我使用添加到 UnitTest 项目的真实文本文件使用 MSTest 为其编写了一些单元测试,这些文件使用 DeploymentItem 属性进行部署。然后我创建指向已部署文件的FileInfo 对象并用它们测试方法。像这样:

    [TestMethod]
    [DeploymentItem(@"..\..\Import\UTF8.txt")]
    public void TestUTF8Detection()
    {
        FileInfo fileInfo = new FileInfo("UTF8.txt");
        bool isUTF8= FormatVerification.IsUTF8(fileInfo);
        Assert.IsTrue(isUTF8);
    }

但是,我了解到使用真实文件可能会更慢且可信度更低(例如 herehere),所以我在考虑如何模拟文件。我想我必须:

  • 创建一个实际上将被测试的子方法,而不是原来的 一个只会调用它,并将 a 作为参数 FileStream 而不是 FileInfo
  • 创建一个以 UTF-8 编码(或不编码)的FileStream,并将其传递给子方法。

所以,我有一些问题,从更具体到更一般:

  1. 如何在没有要读取的真实文件的情况下创建以 UTF-8 编码的 FileStream 对象?
  2. 创建此子方法是允许模拟文件的唯一替代方法吗?
  3. 原来的方法呢?我可以通过某种方式对其进行测试吗?
  4. 创建这种子方法(仅允许单元测试)是否被认为是一种好习惯?
  5. 我真的应该尽量避免在单元测试中使用真实文件,还是有类似的案例可以证明这一点?

【问题讨论】:

  • Unit Testing File I/O的可能重复
  • 请添加IsUTF8方法的实现,这样我就可以回答你的问题了......

标签: c# unit-testing encoding io


【解决方案1】:

FileInfo 是密封的,所以你不能做继承和覆盖的把戏。

我会使用 SystemWrapper 之类的东西,或者按照 Haukinger 建议的方式为 FileInfo 滚动我自己的接口,然后一旦你的代码依赖于接口,它应该很容易模拟你需要的行为。

【讨论】:

    【解决方案2】:

    我猜你最好的办法是将FileInfo 抽象为IMyFileInfo 以及一个从文件名创建它们的工厂(也就是说,它创建原始的FileInfo 加上一个包装器)。

    然后测试可以创建一个模拟 IMyFileInfo)。您的接口/包装器应该公开您在IsUTF8 中需要的FileInfo 中的所有内容。

    然后,生产代码应该使用工厂而不是 new 来创建包装器,而不是真正的 FileInfos。

    【讨论】:

      猜你喜欢
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2022-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多