【发布时间】:2014-04-09 12:26:51
【问题描述】:
我正在尝试编写一个涵盖以下行的单元测试
var fileFullName = fileInfo.FullName;
其中 fileInfo 是 FileInfo 的一个实例。
我正在使用假货填充 FileInfo 对象,但我无法为 FullName 属性提供值,因为它是从基类继承的。
对于未继承的 Name 属性,我可以简单地这样做:
ShimFileInfo.AllInstances.NameGet = info => OriginalFullName;
Microsoft 提供的答案是在基类上创建 shim,在本例中为 FileSystemInfo。但如果我试试这个:
ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName;
它不起作用,因为 FileSystemInfo 是一个无法创建的抽象类,因此无法填充。
在这种特殊情况下,我可以绕过它,因为我可以组合 DirectoryName 和 Name 属性以使其可测试,但我不能只使用我想要的属性似乎很疯狂,因为它恰好来自基础.
有人遇到过这个问题并设法解决了吗?
【问题讨论】:
-
好吧,我还没遇到过这个问题,但是使用反射呢?
-
为什么不直接创建一个测试文件呢?你有什么特别的原因要在测试文件可以使用的情况下使用假货吗?
-
考虑您实际想要测试的内容,如果您没有使用测试文件,那么这里实际测试的是什么?看起来你正在朝着一个方向前进,你将要测试的只是你的假货。
-
@Zache:这听起来像是为了进行单元测试而尝试将逻辑与文件系统逻辑隔离开来,如果涉及实际文件,这将被破坏(不是单元)。即便如此,使用 shims 可能表示重构点。如果有问题的逻辑不需要需要 FileInfo 实例,只需几个字符串,最好将它们传递进去。
-
我已经将实际与文件系统交互的逻辑重构为一个辅助类,并在其上放置一个接口,以便可以在单元测试中对使用它的任何其他类进行模拟。然而,帮助类本身需要单元测试来覆盖完整的代码,因此必须使用 fakes 来填充文件系统操作
标签: c# unit-testing inheritance microsoft-fakes shim