【问题标题】:Unit test, Rhino, The art of unit testing单元测试,犀牛,单元测试的艺术
【发布时间】:2012-06-15 10:10:31
【问题描述】:

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

[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: 预计:2 但是是:1

【问题讨论】:

    标签: unit-testing testing mocking rhino-mocks rhino


    【解决方案1】:

    看起来你尝试实现 ordered 调用序列(详见here):

    • 首先你调用GetSomeNumber("a")应该返回1
    • 然后再次调用GetSomeNumber("a"),结果为2
    • 只有GetSomeNumber("b"),结果才会是3

    是这样,尝试将using(mocks.Record()) 替换为using(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);
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用更简单的Rhino Mocks AAA syntax,您的代码将如下所示(也可以查看this question):

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

      【讨论】:

        猜你喜欢
        • 2011-09-29
        • 1970-01-01
        • 2012-10-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 2010-11-25
        相关资源
        最近更新 更多