Заглушить поведение свойства readOnly

public interface ICell
        {
            int Value{get;}

            void IncrementValue();
        }

Я хочу создать заглушку для этого интерфейса в RhinoMocks. У меня есть свойство только для чтения, и я хочу увеличивать его значение каждый раз, когда вызываю метод IncrementValue (). Это возможно? Я не хочу создавать новый класс для этой заглушки.


person Martín Caballero    schedule 08.01.2011    source источник


Ответы (3)


У меня есть аналогичное предложение Джею, только короче. Не уверен, есть ли у этого какие-то недостатки.

   int count = 0;

    var mock = MockRepository.GenerateStub<ICell>();
    mock.Stub(p => p.Value).WhenCalled(a => a.ReturnValue = count).Return(42);
    mock.Stub(p => p.IncrementValue()).WhenCalled(a => {
        count = (int)count+1; 
    });

Return (42) помещается туда, чтобы сказать: «Значение возвращает что-то, а не бросать», а WhenCalled (a => a.ReturnValue = count) переопределяет возвращаемое значение 42 текущим значением счетчика.

person Alexei Levenkov    schedule 08.01.2011

Вы можете дать Rhino имитировать лямбду, которая будет запускаться при вызове функции. Затем эта лямбда может увеличивать счетчик. Вы можете найти пример здесь

person SwDevMan81    schedule 08.01.2011
comment
Я предполагаю, что проблема Мартина в том, что увеличивать ... интерфейс имеет только свойство get, не установлено - person Pauli Østerø; 08.01.2011

Я тоже это придумал:

cell.Stub(c => c.Value).WhenCalled(m => m.ReturnValue = cell.GetArgumentsForCallsMadeOn(c => c.IncrementValue()).Count).Return(0);

Перед вашей помощью меня смутило поведение метода WhenCalled ... но я думаю, что ваш подход лучше, чем этот

person mpccolorado    schedule 08.01.2011