2016-02-03 5 views
1

В моем коде я использую вызов AppDomain.CurrentDomain.BaseDirectory.Как создать Shim для класса System.AppDomain?

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

Однако после создания поддельной сборки для System я не вижу ShimAppDomain в своем модульном тесте. Это becasue AppDomain is sealed class?

Как я могу изолировать свой тест от звонка AppDomain.CurrentDomain.BaseDirectory?

Для издевательств с использованием Microsoft Fakes Framework и Visual Studio 2015 Enterprise.

ответ

1

нашел это решение

I. Изменено содержание mscorlib.fakes в

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/" Diagnostic="true"> 
    <Assembly Name="mscorlib" Version="4.0.0.0"/> 
    <StubGeneration> 
    <Clear/> 
    </StubGeneration> 
    <ShimGeneration> 
    <Clear/> 
    <Add FullName="System.AppDomain"/> 
    </ShimGeneration> 
</Fakes> 

II. Добавлено using System.Fakes в мой блок. Испытательный файл

III. Добавлено следующее мое подразделение испытаний

using (ShimsContext.Create()) 
{ 
    string baseDir = @"My\Base\Dir"; 

    ShimAppDomain fakeAppDomain = new ShimAppDomain() 
    { 
     BaseDirectoryGet =() => { return baseDir; } 
    }; 

    ShimAppDomain.CurrentDomainGet =() => { return fakeAppDomain; }; 

    string defaultDir = MyConstants.DefaultAppFolder; 

    // both baseDir and defaultDir are same "My\Base\Dir" 
    Assert.AreEqual(baseDir, defaultDir); 
} 

Constants.DefaultAppFolder свойство реализуется следующим образом

internal static class MyConstants 
{ 
    internal static string DefaultAppFolder 
    { 
     get 
     { 
      return AppDomain.CurrentDomain.BaseDirectory; 
     } 
    } 
} 

Это является довольно громоздким, но работает.

+0

И это позволяет: * Вам не нужно нарушать принципы OO и SOLID для модульных тестов * Большинство библиотек с открытым исходным кодом не соответствуют стандартам, * MS сделала неплохую работу. Да, это немного подробный, но он делает что-то действительно мощное. – TomTom