22

初めて呼び出されたときに別の値を返すメソッドをモックする方法を見つけようとしています。たとえば、次のようなものです。

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

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

4

3 に答える 3

36

メソッドで戻り値をインターセプトできます.WhenCalled。メソッドを介して値を提供する必要があることに注意してください。ただし、Rhino は、メソッド呼び出しから変更された.Return場合、単純に無視します。ReturnValue

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() 実際に機能し、同じ結果を得るために使用できるようです。

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

于 2012-05-23T13:44:42.413 に答える
7

単に使用する

mock.Expect(m=>m.SecondsSinceStarted).Return(1).Repeat.Once();
mock.Expect(m=>m.SecondsSinceStarted).Return(2).Repeat.Once();

1これは、最初の呼び出し中と 2 番目の呼び出し中に返され2ます。少なくとも Rhino Mocks 3.6.0.0 では。

于 2012-05-23T15:30:54.050 に答える
0

メソッドが返すものの決定要因が時間である場合は、時間の経過を抽象化して、テストで直接制御できるようにします。

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

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

于 2012-05-23T14:26:43.703 に答える