2014-04-09 10 views
6

sto cercando di scrivere uno unit test che copre la seguente riga. Network Fakes - Come compensare una proprietà ereditata quando la classe base è astratta?

var fileFullName = fileInfo.FullName; 

dove FileInfo è un'istanza di FileInfo.

Sto usando falsi per shimare l'oggetto FileInfo, ma non sono in grado di fornire un valore per la proprietà FullName, perché è ereditato dalla classe base.

Per la proprietà Name, che non è ereditata, posso semplicemente fare questo:

ShimFileInfo.AllInstances.NameGet = info => OriginalFullName; 

La risposta fornita da Microsoft è quello di creare lo spessore sulla classe di base, in questo caso FileSystemInfo. Ma se provo questo:

ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName; 

Non funziona, perché FileSystemInfo è una classe astratta che non può essere creato e quindi non può essere spessorato.

In questo caso particolare, posso andare in giro perché posso combinare le proprietà NomeDirectory e nome per renderlo verificabile, ma sembra pazzesco che non posso utilizzare la proprietà che voglio perché capita di venire dal base.

Qualcuno si è imbattuto in questo problema e è riuscito a risolverlo?

+0

Beh, non ho imbattersi in questo problema, ma per quanto riguarda l'uso di Reflection? –

+0

Perché non creare un file di prova? C'è qualche ragione particolare per cui vuoi usare i falsi quando un file di test funzionerà? – gfish3000

+0

Considera cosa vuoi effettivamente testare, se non stai utilizzando un file di test, cosa è effettivamente sotto test qui? Sembra che tu stia andando in una direzione dove tutto quello che testerai saranno i tuoi falsi. – Zache

risposta

5

Hai detto che lo shimming della classe base non ha funzionato, ma lo faccio esattamente e funziona nei nostri test.

FileInfo in System.dll è definito come FileInfo : FileSystemInfo e FileSystemInfo è in mscorlib. Molti tipi di mscorlib non sono spessorata di default, ma se si aggiunge questo ai vostri file di 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> 

e quindi creare il progetto di test si ottiene un ShimFileSystemInfo per FileSystemInfo da mscorlib, così come il ShimFileInfo per FileInfo da System.dll. Poi questo funziona:

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: funziona sulla mia macchina (Visual Studio 2013, .NET 4.5.1)

di riferimento per il file falsi: Code generation, compilation, and naming conventions in Microsoft Fakes

+0

Anche il pezzo aggiuntivo all'interno di mscorlib.fakes ha fatto il trucco. Serve anche come esempio per tutto ciò che non è generato fuori dagli schemi, il che ha senso. – Dorival

Problemi correlati