Unit testing 单元测试,Rhino,单元测试的艺术

Unit testing 单元测试,Rhino,单元测试的艺术,unit-testing,testing,mocking,rhino-mocks,rhino,Unit Testing,Testing,Mocking,Rhino Mocks,Rhino,我已经开始阅读“单元测试的艺术”,并尝试实现这段代码: [Test] public void ReturnResultsFromMock() { MockRepository mocks = new MockRepository(); IGetResults resultGetter = mocks.DynamicMock<IGetResults>(); using(mocks.Record()) { resultGetter.Get

我已经开始阅读“单元测试的艺术”,并尝试实现这段代码:

[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);
}
[测试]
public void returnsResultsFromMock()
{
MockRepository mocks=新建MockRepository();
IGetResults resultGetter=mocks.DynamicMock();
使用(mocks.Record())
{
resultGetter.GetSomeNumber(“a”);/#1
LastCall.Return(1);
resultGetter.GetSomeNumber(“a”)/#2它应该如何工作?
最后一次呼叫返回(2);
resultGetter.GetSomeNumber(“b”);
最后一次呼叫返回(3);
}
int result=resultGetter.GetSomeNumber(“b”);
断言。等于(3,结果);
int result2=resultGetter.GetSomeNumber(“a”);
断言.AreEqual(1,result2);
int result3=resultGetter.GetSomeNumber(“a”);
断言。等于(2,结果3);
}
我在运行测试后收到此错误消息 AOUT.Loga.Tests.LogAnalyzerTest.ReturnResultsFromMock: 预期:2
但是was:1

看起来您试图实现有序的调用顺序(请参阅详细信息):

  • 首先调用
    GetSomeNumber(“a”)
    应该返回1
  • 然后再次调用
    GetSomeNumber(“a”)
    ,结果将是2
  • 只有这样,结果才会是3
如果是这样,请尝试将
使用(mocks.Record())
替换为
使用(mocks.Ordered())
。但是,这只适用于此调用序列

在您的示例中,您使用的是
using(mocks.Record())
,因此根据您的配置,对
GetSomeNumber(“a”)
的每次调用都将返回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);

您可以尝试使用更简单的,您的代码将如下所示(另请参阅):

//排列
var resultGetter=MockRepository.GenerateMock;
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();
//表演
int result=resultGetter.GetSomeNumber(“b”);
//断言
断言。等于(3,结果);
//表演
int result2=resultGetter.GetSomeNumber(“a”);
//断言
断言.AreEqual(1,result2);
//表演
int result3=resultGetter.GetSomeNumber(“a”);
//断言
断言。等于(2,结果3);
    // 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);