1

「単体テストの技術」を読み始め、このコードを実装しようとしています。

[Test]
public void ReturnResultsFromMock()
{
    MockRepository mocks = new MockRepository();
    IGetResults resultGetter = mocks.DynamicMock<IGetResults>();
    using(mocks.Record())
     {
        resultGetter.GetSomeNumber("a");//#1
        LastCall.Return(1);
        resultGetter.GetSomeNumber("a");//#2 how it should work?
        LastCall.Return(2);
        resultGetter.GetSomeNumber("b");
        LastCall.Return(3);
    }
    int result = resultGetter.GetSomeNumber("b");
    Assert.AreEqual(3, result);
    int result2 = resultGetter.GetSomeNumber("a");
    Assert.AreEqual(1, result2);
    int result3 = resultGetter.GetSomeNumber("a");
    Assert.AreEqual(2, result3);
}

テストAOUT.Loga.Tests.LogAnalyzerTest.ReturnResultsFromMock: Expected: 2 But was: 1を実行した後、このエラー メッセージが表示されます 。

4

2 に答える 2

2

順序付けられた一連の呼び出しを実装しようとしているようです(詳細はこちらを参照):

  • 最初に呼び出すと、GetSomeNumber("a")1 が返されます
  • GetSomeNumber("a")その後、再度呼び出すと、結果は 2 になります
  • そしてその時だけGetSomeNumber("b")、結果は3になります

そうですか、 に置き換えusing(mocks.Record())てみてくださいusing(mocks.Ordered())。ただし、これはこの一連の呼び出しでのみ機能します

あなたの例では、 を使用してusing(mocks.Record())いるため、 を呼び出すたびGetSomeNumber("a")に、構成に従って 2 が返されます。最初に2番目にオーバーライドされますGetSomeNumber("a")。正しい仮定は次のとおりです。

int result = resultGetter.GetSomeNumber("b");
Assert.AreEqual(3, result);
int result2 = resultGetter.GetSomeNumber("a");
Assert.AreEqual(2, result2); // every call to GetSomeNumber("a") will returns 2
int result3 = resultGetter.GetSomeNumber("a");
Assert.AreEqual(2, result3);
于 2012-06-15T11:18:26.423 に答える
0

より単純なRhino Mocks AAA 構文を使用してみると、コードは次のようになります (この質問も参照してください)。

    // Arrange
    var resultGetter = MockRepository.GenerateMock<IGetResults>;
    resultGetter.Expect(x => x.GetSomeNumber("b")).Return(3);
    resultGetter.Expect(x => x.GetSomeNumber("a")).Return(1).Repeat.Once();
    resultGetter.Expect(x => x.GetSomeNumber("b")).Return(2).Repeat.Once();

    // Act
    int result = resultGetter.GetSomeNumber("b");
    // Assert
    Assert.AreEqual(3, result);
    // Act
    int result2 = resultGetter.GetSomeNumber("a");
    // Assert
    Assert.AreEqual(1, result2);
    // Act
    int result3 = resultGetter.GetSomeNumber("a");
    // Assert
    Assert.AreEqual(2, result3);
于 2012-06-19T07:37:46.600 に答える