【问题标题】:.Net Fakes - How to shim an inherited property when the base class is abstract?.Net Fakes - 当基类是抽象的时如何填充继承的属性?
【发布时间】: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


【解决方案1】:

您说填充基类不起作用,但我确实这样做了,并且它在我们的测试中有效。

System.dll 中的FileInfo 定义为FileInfo : FileSystemInfoFileSystemInfo 在 mscorlib 中。 mscorlib 中的许多类型默认情况下不会填充,但如果将其添加到 mscorlib.fakes 文件中:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="mscorlib" Version="4.0.0.0"/>
  <ShimGeneration>
    <Add FullName="System.IO.FileSystemInfo"/>
  </ShimGeneration>
</Fakes>

然后构建您的测试项目,您将获得来自 mscorlib 的 FileSystemInfoShimFileSystemInfo,以及来自 System.dll 的 FileInfoShimFileInfo。然后这个工作:

using (ShimsContext.Create())
{
    var directoryName = "<testPath>";
    var fileName = "test.txt";
    ShimFileSystemInfo.AllInstances.FullNameGet = @this => "42";
    result = new DirectoryInfo(directoryName).GetFiles(fileName).First();
    Assert.AreEqual("42", result.FullName);   // the fake fullname
    Assert.AreEqual("test.txt", result.Name); // the real name
}

警告:在我的机器上工作(Visual Studio 2013,.NET 4.5.1)

假货文件参考:Code generation, compilation, and naming conventions in Microsoft Fakes

【讨论】:

  • mscorlib.fakes 中的额外部分在这里也起到了作用。它还可以作为不是开箱即用生成的所有内容的示例,这是有道理的。
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2013-06-10
  • 1970-01-01
相关资源
最近更新 更多