web-dev-qa-db-ja.com

RhinoMocks-複数の呼び出しで戻り値が(同じパラメーターを渡された場合でも)変更されるメソッドをモックします

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);
}

これを可能にするものはありますか?ステートマシンを実装するゲッターのサブを実装することに加えて?

乾杯、

アレックス

21
AlexC

_.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を返します。

35
k.m

単に使用する

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では

6

メソッドが返すものの決定要因は時間ですか?もしそうなら、私はあなたがあなたのテストでそれを直接制御できるように時間の経過を抽象化しようとします。

GetElapsedTime()というメンバーを持つITimeProviderというインターフェイスのようなもので、アプリケーション全体で使用するデフォルトの実装を作成します。

次に、テストするときに、モックされたITimeProviderを渡して、アプリケーションが時間の経過として認識するものを制御します。

0
theMothaShip