繁体   English   中英

以FileInfo为参数的单元测试方法

[英]Unit test method that takes FileInfo as a parameter

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

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

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

但是,我已经读到,使用真实文件可能会更慢且更不值得信任(例如herehere ),所以我在考虑如何模拟文件。 我想我必须:

  • 创建一个实际上会经过测试的子方法,而不是仅会调用它的原始方法,该方法将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM