Заглушить свойство, которое находится в конкретном классе, но не в интерфейсе для модульного тестирования - PullRequest
0 голосов
/ 14 октября 2011

У меня есть класс, который содержит больше информации, чем мой интерфейс. У него есть свойство, которое я не раскрыл в своем интерфейсе.

 public interface IViewResolver
{
    object GetViewFor(string viewName);

}

Теперь я хочу реализовать MefViewResolver на основе этого интерфейса.

public class ViewResolver : IViewResolver
{


    [ImportMany]
    public IEnumerable<Lazy<IView,IViewMetaData>> Views { get; set; }



    public object GetViewFor(string viewName)
    {
        var view = Views.Where(x => x.Metadata.Name == viewName).FirstOrDefault();

        return view == null ? null : view.Value;
    }

}

Мой SUT получает IResolver для каждой инъекции конструктора, загруженной с моим mefViewResolver. В моем модульном тесте я хотел бы предварительно установить свойство Views снаружи, не используя mef или не будучи специфичным для mef в моем интерфейсе. По сути, я хочу установить виды с ожидаемым значением и посмотреть, возвращает ли моя модель представления, которая использует IViewResolver, предустановленное представление ... Как я могу заглушить свойство views, даже если оно не существует в моем интерфейсе ...

Если я на неправильном пути ... любые исправления будут очень ценными ..

Спасибо Д.

1 Ответ

2 голосов
/ 14 октября 2011

Если вы хотите протестировать вашу ViewModel (а не Resolver), которая знает только об интерфейсе IViewResolver, у вас не должно возникнуть никаких проблем: единственный метод (согласно предоставленному коду), к которому может обращаться ViewModel, этоGetViewFor.Все, что вам нужно сделать, это вернуть соответствующий View для каждого теста, учитывая имя View.В RhinoMocks это должно быть что-то вроде:

// Arrange the test objects
var viewResolverMock = MockRepository.GenerateMock<IViewResolver>();
viewResolverMock.Stub(x => x. GetViewFor(thisTestViewName).Return(thisTestView);
var myViewModel = new MyViewModel(viewResolverMock);

// Do the actual operation on your tested object (the view model)
var actualResult = myViewModel.DoSomethingWithTheView();

// Assert 
AssertAreEqual(expectedResult, actualResult);
...