2014-04-09 17 views
6

Próbuję napisać badanej jednostki, które obejmuje następujący wiersz.Net Fakes - Jak przekazać odziedziczoną właściwość, gdy klasa podstawowa jest abstrakcyjna?

var fileFullName = fileInfo.FullName; 

gdzie Fileinfo jest instancją FileInfo.

Używam podróbek do shim obiektu FileInfo, ale nie jestem w stanie podać wartości dla właściwości FullName, ponieważ jest ona dziedziczona z klasy bazowej.

dla właściwości Nazwa, która nie jest dziedziczona, mogę po prostu to zrobić:

ShimFileInfo.AllInstances.NameGet = info => OriginalFullName; 

Odpowiedź dostarczone przez Microsoft jest stworzenie podkładkę na klasy bazowej, w tym przypadku FileSystemInfo. Ale gdy próbuję to:

ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName; 

To nie działa, ponieważ FileSystemInfo jest klasą abstrakcyjną, które nie mogą być tworzone i dlatego nie może być podkładano.

W tym konkretnym przypadku mogę obejść ten problem, ponieważ mogę połączyć właściwości DirectoryName i Name, aby umożliwić jego testowanie, ale wydaje się szalone, że nie mogę po prostu użyć właściwości, której chcę, ponieważ zdarza się, że pochodzi ona od baza.

Czy ktoś napotkał ten problem i zdołał go rozwiązać?

+0

Cóż, nie mam napotkasz ten problem, ale co z korzystaniem z Reflection? –

+0

Dlaczego nie wystarczy utworzyć plik testowy? Czy istnieje jakiś szczególny powód, dla którego chcesz używać podróbek, gdy zrobi to plik testowy? – gfish3000

+0

Zastanów się, co naprawdę chcesz przetestować, jeśli nie używasz pliku testowego, to co jest aktualnie testowane? Wygląda na to, że zmierzasz w kierunku, w którym wszystko, co będziesz testować, to twoje podróbki. – Zache

Odpowiedz

5

Powiedziałeś, że przyciemnienie klasy bazowej nie działa, ale robię dokładnie to i działa w naszych testach.

FileInfo w System.dll jest zdefiniowane jako FileInfo : FileSystemInfo, a FileSystemInfo jest w mscorlib. Wiele typów w mscorlib nie podkładano domyślnie, ale jeśli dodać do swoich mscorlib.fakes file:

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

a następnie budować swój projekt testowy masz ShimFileSystemInfo dla FileSystemInfo od mscorlib, jak również dla ShimFileInfoFileInfo z System.dll. Wtedy to działa:

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 
} 

Zastrzeżenie: działa na moim komputerze (Visual Studio 2013, .NET 4.5.1)

odniesienia dla pliku podróbki: Code generation, compilation, and naming conventions in Microsoft Fakes

+0

Również ten dodatkowy element wewnątrz mscorlib.fakes zrobił tutaj lewę. Jest to również przykład dla wszystkiego, co nie jest generowane z pudełka, co ma sens. – Dorival

Powiązane problemy