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属性使其可测试,但似乎很疯狂,我不能只使用我想要的属性,因为它恰好来自基地.
有没有人来解决这个问题并设法解决它?
你说填充基类不起作用,但我确实这样做,它在我们的测试中起作用.
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中的代码生成,编译和命名约定