2016-12-22 11 views
1

У меня есть интерфейс, как этотУстановка только для чтения свойства класса для модульного тестирования

public interface IConnection 
{ 
    Strategy Gc { get; } 

    bool IsConnected(); 

    bool Connect(); 
} 

Я хочу модульное тестирование методов класса, который использует этот интерфейс. Теперь я хочу установить Gc, но это происходит только для чтения. Есть ли способ установить поле Gc без внесения изменений в этот класс интерфейса? Я использую подделки MS и Nsubstitute для модульного тестирования. Однако, по-видимому, ни одно из них не дает решения. PrivateObject тоже не работает.

Изменение интерфейса не является вариантом. Предлагайте лучшие решения.

ответ

8

С NSubstitute это довольно легко. Сначала нужно создать макет для интерфейса:

var mock = Substitute.For<IConnection>(); 

Теперь вы можете издеваться элемент, установив любой обратный типа для свойства:

mock.Gc.Returns(Substitute.For<Strategy>()); 

Наконец предусмотреть, что высмеивал экземпляр в качестве параметра службы в зависимости от что экземпляр, например:

var target = new MyClassToTest(); 
target.DoSomething(mock); // mock is an instance of IConnection 

Теперь, когда ваш метод называется он возвращает манекен-экземпляр для Strategy. Конечно, вы также можете установить любой другой произвольный возвращаемый тип в пределах Returns -ступенчатого. Просто взгляните на http://nsubstitute.github.io/help/set-return-value для получения дополнительной информации.

+1

Это сработало, спасибо. Я почесываю голову так, как я этого не делал. –