2011-01-08 6 views
5
public interface ICell 
     { 
      int Value{get;} 

      void IncrementValue(); 
     } 

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

ответ

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) ставятся там, чтобы сказать "Value возвращает что-то, не бросать" и WhenCalled (а => a.ReturnValue = количество) переопределение, возвращающую юдоль 42 с текущим значением счетчика.

0

Вы можете дать носорогу издеваться над лямбдой, которую нужно запустить при вызове функции get. Эта лямбда может затем увеличить счетчик. Вы можете найти пример here

+0

я думаю, проблема Мартина это то, что нужно увеличивать ... интерфейс имеет только свойство get, не установлено –

0

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

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

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