Rhinomocks 3.5 for dummies ...即我

时间:2008-12-16 20:12:31

标签: unit-testing rhino-mocks

我正在尝试使用Rhinomocks 3.5和新的lambda表示法来模拟一些测试。我读过this,但还有很多问题。有没有完整的例子,特别是对于MVC类型的架构?

例如,嘲笑这个的最好方法是什么。

    public void OnAuthenticateUnitAccount()
    {
        if(AuthenticateUnitAccount != null)
        {
            int accountID = int.Parse(_view.GetAccountID());
            int securityCode = int.Parse(_view.GetSecurityCode());
            AuthenticateUnitAccount(accountID, securityCode);
        }
    }

有一个视图界面和一个演示者界面。它在控制器上调用一个事件。

我想出的就是这个。

[TestMethod()]
    public void OnAuthenticateUnitAccountTest()
    {
        IAuthenticationView view = MockRepository.GenerateStub<IAuthenticationView>();
        IAuthenticationPresenter target = MockRepository.GenerateMock<IAuthenticationPresenter>();

        target.Raise(x => x.AuthenticateUnitAccount += null, view.GetPlayerID(), view.GetSecurityCode());
        target.VerifyAllExpectations();
    }

它过去但我不知道它是否正确。

是的,我们在开发后正在进行测试......需要快速完成。

1 个答案:

答案 0 :(得分:2)

我假设这是在你的一个控制器中。此外,我假设你有办法通过构造函数或setter传递视图数据,并且你有办法注册AuthenticateUnitAccount处理程序。鉴于此,我会做类似以下的事情:

[TestMethod]
public void OnAuthenticateUnitAccountSuccessTest()
{
    IAuthenticationView view = MockRepository.GenerateStub<IAuthenticationView>();
    view.Stub( v => GetPlayerID() ).Returns( 1 );
    view.Stub( v => GetSecurityCode() ).Returns( 2 );

    FakeAuthenticator authenticator = MockRepository.GenerateMock<FakeAuthenticator>();
    authenticator.Expect( a => a.Authenticate( 1, 2 ) );

    Controller controller = new Controller( view );
    controller.AuthenticateUnitAccount += authenticator.Authenticate;

    controller.OnAuthenicateAccount()

    authenticator.VerifyAllExpectations();
}

FakeAuthenticator类包含一个与处理程序签名匹配的Authenticate方法。因为您需要知道是否调用此方法,您需要模拟它而不是将其存根以确保使用正确的参数调用它等。您会注意到我直接调用该方法而不是引发事件。由于您只需要在此处测试代码,因此无需测试引发事件时发生的情况。你可能想在别处测试。在这里,我们只想知道使用正确的参数调用正确的方法。

对于失败,您可以执行以下操作:

[TestMethod]
[ExpectedException(typeof(UnauthorizedException))]
public void OnAuthenticateUnitAccountFailureTest()
{
    IAuthenticationView view = MockRepository.GenerateStub<IAuthenticationView>();
    view.Stub( v => GetPlayerID() ).Returns( 1 );
    view.Stub( v => GetSecurityCode() ).Returns( 2 );

    FakeAuthenticator authenticator = MockRepository.GenerateMock<FakeAuthenticator>();
    authenticator.Expect( a => a.Authenticate( 1, 2 ) )
                 .Throw( new UnauthorizedException() );

    Controller controller = new Controller( view );
    controller.AuthenticateUnitAccount += authenticator.Authenticate;

    controller.OnAuthenicateAccount()

    authenticator.VerifyAllExpectations();
}