我正在尝试使用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();
}
它过去但我不知道它是否正确。
是的,我们在开发后正在进行测试......需要快速完成。
答案 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();
}