.Net Fakes - 当基类是抽象的时,如何填充继承的属性?

lex*_*ica 8 c# inheritance unit-testing shim microsoft-fakes

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

var fileFullName = fileInfo.FullName;
Run Code Online (Sandbox Code Playgroud)

其中fileInfo是FileInfo的一个实例.

我使用fakes来填充FileInfo对象,但是我无法为FullName属性提供值,因为它是从基类继承的.

对于未继承的Name属性,我可以这样做:

ShimFileInfo.AllInstances.NameGet = info => OriginalFullName;
Run Code Online (Sandbox Code Playgroud)

Microsoft提供的答案是在基类上创建填充程序,在本例中为FileSystemInfo.但如果我试试这个:

ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName;
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为FileSystemInfo是一个无法创建的抽象类,因此无法进行填充.

在这种特殊情况下,我可以解决它,因为我可以结合DirectoryName和Name属性使其可测试,但似乎很疯狂,我不能只使用我想要的属性,因为它恰好来自基地.

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

And*_*own 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>
Run Code Online (Sandbox Code Playgroud)

然后构建您从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
}
Run Code Online (Sandbox Code Playgroud)

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

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