将文件信息作为参数的单元测试方法

本文关键字:单元 测试方法 参数 文件 信息 | 更新日期: 2023-09-27 18:33:49

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

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

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

但是,我已经读到使用真实文件可能会更慢且更不值得信赖(就像这里和这里一样(,所以我在想如何模拟文件。我想我必须:

  • 创建一个实际上将进行测试的子方法,而不是原始方法一个只是称它为,并且将它作为论据 FileStream而不是FileInfo.
  • 创建一个以 UTF-8 编码(或不编码(的FileStream,并将其传递给子方法。

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

  1. 如何在没有真实文件的情况下创建以 UTF-8 编码的 FileStream 对象?
  2. 创建此子方法是允许模拟文件的唯一替代方法吗?
  3. 原来的方法呢?我可以以某种方式测试它吗?
  4. 创建这种子方法(仅允许单元测试(是否被认为是一种好的做法?
  5. 我真的应该尽量避免在单元测试中使用真实文件,还是有像这样的情况来证明它的合理性?

将文件信息作为参数的单元测试方法

FileInfo是密封的,因此您无法执行继承和覆盖技巧。

我会使用像SystemWrapper这样的东西,或者像Haukinger建议的那样为FileInfo滚动我自己的界面,然后一旦你的代码依赖于接口,它应该很容易模拟你需要的行为。

我想你最好的选择是将FileInfo与从文件名创建它们的工厂一起抽象到IMyFileInfo中(也就是说,它创建原始FileInfo加上包装器(。

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

然后,生产代码应使用工厂而不是new来创建包装器,而不是实际的FileInfo