2回目に呼び出されたときに異なる値を返すメソッドをモックする方法を探しています。たとえば、次のようなものです。
public interface IApplicationLifetime
{
int SecondsSinceStarted {get;}
}
[Test]
public void Expected_mock_behaviour()
{
IApplicationLifetime mock = MockRepository.GenerateMock<IApplicationLifetime>();
mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();
Assert.AreEqual(1, mock.SecondsSinceStarted);
Assert.AreEqual(2, mock.SecondsSinceStarted);
}
これを可能にするものはありますか?ステートマシンを実装するゲッターのサブを実装することに加えて?
乾杯、
アレックス
_.WhenCalled
_メソッドを使用して戻り値をインターセプトできます。 _.Return
_メソッドを介して値を提供する必要があることに注意してください。ただし、ReturnValue
がメソッド呼び出しから変更された場合、Rhinoは単にそれを無視します。
_int invocationsCounter = 1;
const int IgnoredReturnValue = 10;
mock.Expect(m => m.SecondsSinceLifetime)
.WhenCalled(mi => mi.ReturnValue = invocationsCounter++)
.Return(IgnoredReturnValue);
Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(1));
Assert.That(mock.SecondsSinceLifetime, Is.EqualTo(2));
_
編集:
もう少し掘り下げてみると、この場合は.Repeat.Once()
doesが実際に機能し、同じ結果を達成するために使用できるようです。
_mock.Expect(m => m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m => m.SecondsSinceStarted).Return(2).Repeat.Once();
mock.Expect(m => m.SecondsSinceStarted).Return(3).Repeat.Once();
_
連続した呼び出しで1、2、3を返します。
単に使用する
mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();
これにより、最初の呼び出しで1
が返され、2番目の呼び出しで2
が返されます。少なくともRhinoMocks3.6.0.0では
メソッドが返すものの決定要因は時間ですか?もしそうなら、私はあなたがあなたのテストでそれを直接制御できるように時間の経過を抽象化しようとします。
GetElapsedTime()というメンバーを持つITimeProviderというインターフェイスのようなもので、アプリケーション全体で使用するデフォルトの実装を作成します。
次に、テストするときに、モックされたITimeProviderを渡して、アプリケーションが時間の経過として認識するものを制御します。