2016-03-01 5 views
0

У меня есть одноэлементный-класс, который я хочу, чтобы дразнить для тестирования следующим образом:Создать фиктивный экземпляр для одноплодной

public class MyClass { 
    private readonly static MyClass _instance = new MyClass(); 
    public MyClass Instance { get { return this._instance; }} 

    private MyClass() 
    { 
     DoSomething(); 
    } 
} 

Как частный конструктор MyClass имеет некоторые тяжелые логики, включая чтение некоторые конфигурационные-файлы, которые я хочу для издевательства одиночного экземпляра для целей тестирования. Однако я не вижу никакого способа сделать это, поскольку я не могу пометить свойство Instance виртуальным.

Я думаю, у меня есть две возможности, но я не знаю, что подходит лучше. Первый из них делает (частный) DomeSomething -метод переопределяемым (что означает protected и virtual) и создает для него производную реализацию в производном классе (макет). Однако изменение моей класс-структуры для тестирования не кажется мне правильным.

Другим способом может быть использование FormatterServices.GetUninitializedObject(), как предложено в this approach. Я просто создаю экземпляр без установки любых ее членов. Впоследствии я мог бы проиндексировать членам, которые мне нужны, используя отражение более простой логики. В любом случае, это тоже кажется мне грубым.

Есть ли другие возможности у меня? Или мне нужно выбирать между этими двумя раздражающими?

ответ

0

Да, нет действительно чистого способа сделать это. Вам придется либо изменить интерфейс класса, либо использовать трюки, например reflection/FormatterServices.GetUninitializedObject, как вы уже упоминали.

1

Я бы порекомендовал вас попробовать Typemock Isolator.

Его решение для насмешливых одиночных игр уникально легко, никаких изменений в производственном коде не требуется (ваши личные методы все еще остаются закрытыми). Посмотрите на пример:

[TestMethod] 
public void TestMethod1() 
{ 
    var fakeSingleton = Isolate.Fake.AllInstances<MyClass>(); 

    Isolate.WhenCalled(() => fakeSingleton.someFunction()).WillReturn(true); 

    Assert.IsTrue(MyClass.Instance.someFunction()); 
} 

Вы создаете подделку, вызвав Isolate.Fake.AllInstances<MyClass>(), при настройке поведения вы любите, и это будет выставиться на экземпляре одноэлементных, а также.

Надеюсь, это поможет!

+0

Nice инструмент. Unfortunetaly его не бесплатно, но я считаю, что попробуй его бесплатную пробную версию. – HimBromBeere

Смежные вопросы