2014-04-09 4 views
6

Ich versuche, einen Unit-Test zu schreiben, die die folgende Zeile.Net Fakes - Wie shim eine geerbte Eigenschaft, wenn die Basisklasse abstrakt ist?

var fileFullName = fileInfo.FullName; 

abdeckt, in dem fileinfo eine Instanz von Fileinfo ist.

Ich verwende Fälschungen, um das FileInfo-Objekt zu shimmen, aber ich kann keinen Wert für die FullName-Eigenschaft angeben, da es von der Basisklasse geerbt wird.

Für die Name-Eigenschaft, die nicht vererbt wird, kann ich dies einfach tun:

ShimFileInfo.AllInstances.NameGet = info => OriginalFullName; 

Die von Microsoft bereitgestellte Antwort ist den Shim auf der Basisklasse zu erstellen, in diesem Fall Filesysteminfo. Aber wenn ich versuche, dies:

ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName; 

es nicht funktioniert, weil Filesystem eine abstrakte Klasse, die erstellt werden kann und daher nicht unterfüttert werden kann. In diesem speziellen Fall kann ich es umgehen, weil ich die Eigenschaften DirectoryName und Name kombinieren kann, um es testbar zu machen, aber es scheint verrückt, dass ich nicht einfach die Eigenschaft verwenden kann, die ich will, weil es zufällig von der kommt Base.

Hat jemand dieses Problem überstanden und es geschafft, es zu lösen?

+0

Nun, ich habe nicht stößt auf dieses Problem, aber was ist mit Reflection? –

+0

Warum nicht einfach eine Testdatei erstellen? Gibt es einen bestimmten Grund, warum Sie Fälschungen verwenden möchten, wenn eine Testdatei funktioniert? – gfish3000

+0

Überlegen Sie, was Sie eigentlich testen möchten, wenn Sie keine Testdatei verwenden, was wird hier eigentlich getestet? Es sieht so aus, als ob du in eine Richtung gehst, in der alles, was du testen wirst, deine Fälschungen sind. – Zache

Antwort

5

Sie sagten, dass das Shimmen der Basisklasse nicht funktionierte, aber ich mache genau das und es funktioniert in unseren Tests.

FileInfo in System.dll ist definiert als FileInfo : FileSystemInfo, und FileSystemInfo ist in mscorlib. Viele Arten in mscorlib sind standardmäßig nicht unterfüttert, aber wenn Sie diese zu Ihrem mscorlib.fakes Datei hinzufügen:

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

und dann Testprojekt erstellen Sie eine ShimFileSystemInfo für FileSystemInfo von mscorlib erhalten, sowie die ShimFileInfo für FileInfo von System.dll. Dann funktioniert das:

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 
} 

Caveat: funktioniert auf meinem Rechner (Visual Studio 2013, .NET 4.5.1)

Referenz für die Datei Fakes: Code generation, compilation, and naming conventions in Microsoft Fakes

+0

Das zusätzliche Stück in der mscorlib.fakes hat auch hier den Trick gemacht. Es dient auch als Beispiel für alles, was nicht out of the box erzeugt wird, was sinnvoll ist. – Dorival

Verwandte Themen