8

我正在尝试编写一个涵盖以下行的单元测试

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 属性以使其可测试,但我不能只使用我想要的属性似乎很疯狂,因为它恰好来自基础。

有没有人遇到这个问题并设法解决它?

4

1 回答 1

5

你说填充基类没有用,但我就是这样做的,它在我们的测试中有效。

FileInfo在 System.dll 中定义为FileInfo : FileSystemInfo,并且FileSystemInfo在 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 中获得ShimFileSystemInfofor FileSystemInfo,以及从 System.dll中获得ShimFileInfofor 。FileInfo然后这个工作:

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)

fakes 文件参考:Microsoft Fakes 中的代码生成、编译和命名约定

于 2014-10-08T17:51:13.870 回答