Rhinomocks 3.5 для чайников ... то есть я - PullRequest
0 голосов
/ 16 декабря 2008

Я пытаюсь использовать Rhinomocks 3.5 и новую лямбда-нотацию для проверки некоторых тестов. Я прочитал это , но у меня есть еще много вопросов. Есть ли полные примеры, особенно для архитектуры типа 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 Ответ

2 голосов
/ 16 декабря 2008

Я предполагаю, что это в одном из ваших контроллеров. Кроме того, я предполагаю, что у вас есть способ передать данные представления через конструктор или установщик, и что у вас есть способ зарегистрировать обработчик 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();
}
...