将文件信息作为参数的单元测试方法
本文关键字:单元 测试方法 参数 文件 信息 | 更新日期: 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
,并将其传递给子方法。
所以,我有一些问题,从更具体到更笼统:
- 如何在没有真实文件的情况下创建以 UTF-8 编码的
FileStream
对象? - 创建此子方法是允许模拟文件的唯一替代方法吗?
- 原来的方法呢?我可以以某种方式测试它吗?
- 创建这种子方法(仅允许单元测试(是否被认为是一种好的做法?
- 我真的应该尽量避免在单元测试中使用真实文件,还是有像这样的情况来证明它的合理性?
FileInfo
是密封的,因此您无法执行继承和覆盖技巧。
我会使用像SystemWrapper这样的东西,或者像Haukinger建议的那样为FileInfo滚动我自己的界面,然后一旦你的代码依赖于接口,它应该很容易模拟你需要的行为。
我想你最好的选择是将FileInfo
与从文件名创建它们的工厂一起抽象到IMyFileInfo
中(也就是说,它创建原始FileInfo
加上包装器(。
然后,测试可以创建一个模拟IMyFileInfo
(。您的接口/包装器应该公开IsUTF8
中您需要的FileInfo
中的所有内容。
然后,生产代码应使用工厂而不是new
来创建包装器,而不是实际的FileInfo
。