2014-04-09 8 views
6

Я пытаюсь написать модульный тест, который охватывает следующую строку.Net Fakes - Как прокрасить унаследованное свойство, когда базовый класс является абстрактным?

var fileFullName = fileInfo.FullName; 

где FILEINFO является экземпляром FileInfo.

Я использую подделки, чтобы закрепить объект FileInfo, но я не могу предоставить значение для свойства FullName, потому что он унаследован от базового класса.

Для свойства Name, которое не наследуется, я могу просто сделать это:

ShimFileInfo.AllInstances.NameGet = info => OriginalFullName; 

Ответ, предоставленный корпорацией Майкрософт, чтобы создать прокладку на базовом классе, в этом случае FileSystemInfo. Но если я пытаюсь это:

ShimFileSystemInfo.AllInstances.FullNameGet = info => OriginalFullName; 

Это не работает, потому что FileSystemInfo это абстрактный класс, который не может быть создан и, следовательно, не может быть подкладками.

В этом конкретном случае я могу обойти его, потому что я могу комбинировать свойства DirectoryName и Name, чтобы сделать его проверяемым, но кажется сумасшедшим, что я не могу просто использовать свойство, которое я хочу, потому что оно происходит из база.

Пришел ли кто-нибудь к этой проблеме и смог ее решить?

+0

Ну, у меня нет столкнулись с этой проблемой, но как насчет использования Reflection? –

+0

Почему бы просто не создать тестовый файл? Есть ли какая-то особая причина, по которой вы хотите использовать подделки, когда тестовый файл будет делать? – gfish3000

+0

Рассмотрите, что вы на самом деле хотите протестировать, если вы не используете тестовый файл, то что на самом деле тестируется? Похоже, вы идете в направлении, все, что вы будете тестировать, это ваши подделки. – Zache

ответ

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> 

, а затем построить свой тестовый проект, вы получите ShimFileSystemInfo для FileSystemInfo из mscorlib, а также ShimFileInfo для FileInfo из System.dll. Тогда это работает:

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 
} 

Оговорка: работает на моей машине (Visual Studio 2013, .NET 4.5.1)

ссылочного файла подделках: Code generation, compilation, and naming conventions in Microsoft Fakes

+0

Дополнительная часть внутри mscorlib.fakes тоже сделала трюк. Это также служит примером для всего, что не создается из коробки, что имеет смысл. – Dorival