public interface ICell
{
int Value{get;}
void IncrementValue();
}
RhinoMocksでこのインターフェースのスタブを作成したいと思います。読み取り専用プロパティがあり、IncrementValue()メソッドを呼び出すたびに彼の値をインクリメントしたいと思います。これは可能ですか?このスタブ用に新しいクラスを作成したくありません。
public interface ICell
{
int Value{get;}
void IncrementValue();
}
RhinoMocksでこのインターフェースのスタブを作成したいと思います。読み取り専用プロパティがあり、IncrementValue()メソッドを呼び出すたびに彼の値をインクリメントしたいと思います。これは可能ですか?このスタブ用に新しいクラスを作成したくありません。
ジェイと同じような提案がありますが、少し短いです。これにいくつかの欠点があるかどうかはわかりません。
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を返すことをオーバーライドします。
関数getが呼び出されたときに実行するラムダをrhinoモックに与えることができます。このラムダは、カウンターをインクリメントできます。ここに例があります
私もこれを思いついた:
cell.Stub(c => c.Value).WhenCalled(m => m.ReturnValue = cell.GetArgumentsForCallsMadeOn(c => c.IncrementValue()).Count).Return(0);
あなたの助けの前に私はWhenCalledメソッドの振る舞いに混乱していました...しかし私はあなたのアプローチがこれよりも優れていると思います