Rhino Mocks的新语法

时间:2009-10-05 13:13:55

标签: c# .net unit-testing rhino-mocks

我正在努力了解新的AAA语法如何在Rhino Mocks中运行。我的大部分测试都是这样的:

    [Test]
    public void Test()
    {
        //Setup
        ISth sth= mocks.DynamicMock<ISth>();

        //Expectations
        Expect.Call(sth.A()).Return("sth");

        mocks.ReplayAll();
        //Execution
        FunctionBeingTested(sth);
        //...asserts, etc

        //Verification
        mocks.VerifyAll();
    }

使用AAA语法会是什么样子?

2 个答案:

答案 0 :(得分:3)

最有可能是这样的:

[Test]
public void Test()
{
    // Arrange
    ISth sth= MockRepository.GenerateMock<ISth>();

    sth
      .Stub(x => x.A())
      .Return("sth");

    // Act
    FunctionBeingTested(sth);

    // Assert
}

要真正受益于新的AAA语法,您必须改变主意。我试着解释一下。

我的建议存在重大差异:没有“Expect-Verify”。所以我建议不要期待这个电话,因为有一个回报值。我假设该方法在未调用sth.A时无法通过测试,因为它将错过正确的返回值。它至少会失败一个其他断言。

这实际上是一件好事。

  • 你可以将Stub移动到TestInitialize,当在测试中没有调用stubbed方法时它不会受到伤害(这不是一个期望)。你的测试会变短。
  • 您的测试不知道被测系统“如何”完成工作,您只需检查结果。您的测试将变得更加可维护。

还有另一种情况,您确实需要检查是否已在模拟上调用方法。主要是如果它返回void。例如:应该触发事件,提交事务等等。请使用AssertWasCalled

[Test]
public void Test()
{
    // Arrange
    ISth sth= MockRepository.GenerateMock<ISth>();

    // Act
    FunctionBeingTested(sth);

    // Assert
    sth
      .AssertWasCalled(x => x.A());
}

注意:没有返回值,所以没有Stub。这是一个理想的案例。当然,您可以同时拥有StubAssertWasCalled


还有ExpectVerifyAllExpectations,其实际行为与旧语法相似。我只会在你需要 StubAssertWasCalled的同一个测试中使用它们,你有你不想要的互补参数约束写两次。通常,避免 ExpectVerifyAllExpectations

答案 1 :(得分:1)

来自Ayende的博客的例子:

[Test]
public void WhenUserForgetPasswordWillSendNotification_UsingExpect()
{
    var userRepository = MockRepository.GenerateStub<IUserRepository>();
    var notificationSender = MockRepository.GenerateMock<INotificationSender>();

    userRepository.Stub(x => x.GetUserById(5)).Return(new User { Id = 5, Name = "ayende" });
    notificationSender.Expect(x => x.Send(null)).Constraints(Text.StartsWith("Changed"));

    new LoginController(userRepository, notificationSender).ForgotMyPassword(5);

    notificationSender.VerifyAllExpectations();
}

你的测试中的变化

[Test]
    public void Test()
    {
        //Arrange
        var sth= MockRepository.GenerateMock<ISth>();  
        sth.Expect(x=>sth.A()).Return("sth");

        //Act
        FunctionBeingTested(sth);

        //Assert
        sth.VerifyAllExpectations();
    }

但这只是一个长镜头。写了,因为我怀疑它。