Медиатор модульного тестирования и просмотр в robotlegs 2

Я изучаю фреймворк robotlegs, но этот вопрос также носит общий характер.

У меня есть класс Mediator, который прослушивает событие на кнопке в представлении, и в этом событии он отправляет сигнал, содержащий VO, который содержит свойства двух объектов TextField в представлении.

Ниже приведен класс посредника.

button - это частная переменная, которая имеет только геттер и не имеет сеттера в представлении.

Мой вопрос в том, как бы я тестировал этот класс? 1. проверить, приходит ли событие об отправке сигнала... 2. когда сигнал отправляется, содержит ли он правильный VO

Я знаю, что мне нужно использовать Mock, и я использую mockolate, но я вращаюсь по кругу, потому что я не знаю, как издеваться над отправленным событием с помощью кнопки из класса представления?

Спасибо за помощь

        public class LoginFormMediator extends Mediator {

            //---------------------------------------------------------------
            //  Public variables
            //---------------------------------------------------------------



            [Inject]
            public var view:LoginFormView;
            [Inject]
            public var authorizationSignal:AuthorizationSignal;


            //---------------------------------------------------------------
            //  Public Functions
            //---------------------------------------------------------------

            override public function initialize():void
            {
                view.button.addEventListener(MouseEvent.CLICK,onLogin,false,0,true);

            }



            //---------------------------------------------------------------
            //  Private methods
            //---------------------------------------------------------------
            private function onLogin(event:MouseEvent):void {
                var userInfo:UserInfo = new UserInfo(view.usernameField.text,view.passwordField.text);
                authorizationSignal.dispatch(userInfo);

            }

        }
        }

person ThanksBro    schedule 12.12.2012    source источник


Ответы (1)


Есть несколько возможностей:

1/ не раскрывайте кнопку и дайте посреднику выслушать ее напрямую. Представление должно отправлять конкретное конкретное событие, которое прослушивает посредник, и желательно, чтобы оно описывало намерение пользователя, а не действие пользователя. Например: пусть представление отправляет событие LoginFormViewEvent.LOGIN_REQUESTED или, возможно, событие LoginFormViewEvent.CREDENTIALS_PROVIDED. Причина, по которой это лучше, заключается в том, что он не привязывает вашего посредника к конкретной реализации вашего представления. Например, возможно, позже вы захотите добавить какое-то правило проверки, которое необходимо запустить перед отправкой учетных данных. Если вы слушаете кнопку напрямую, вы либо будете писать логику проверки в посреднике, что определенно нет-нет, либо вам нужно будет реорганизовать свое представление.

Работа посредников состоит в том, чтобы быть посредником между представлением и системой, не более того. Ему не нужно знать, какие элементы пользовательского интерфейса находятся в представлении, просто передайте данные из представления в систему и наоборот.

2/Другая возможность - позволить посреднику передать общесистемный сигнал представлению, которое выполняет диспетчеризацию и заполнение VO.

//mediator
[Inject]
public var view:LoginFormView;
[Inject]
public var authorizationSignal:AuthorizationSignal;

override public function initialize():void{
    view.authorizationSignal = authorizationSignal;
}

//view
public var authorizationSignal : ISignal;

public function init():void{
    button.addEventlistener( MouseEvent.CLICK, button_clickHandler );
}

private function button_clickHandler( event : MouseEvent ) : void{
    var vo : UserInfo = new UserInfo( usernameField.text, passwordField.text);
    authorizationSignal.dispatch( vo );
}

Я склонен делать сигнал условно конкретизированным и универсальным, чтобы сделать представление более удобным для повторного использования. Нравится:

//view
private var _authorizationSignal : ISignal;
public function set authorizationSignal( value : ISignal ) : void{
    _authorizationSignal = value;
}
public function get authorizationSignal() : ISignal{
    return _authorizationSignal ||= new Signal();
}

Тогда внедрение сигнала является необязательным, и представление предоставляет экземпляр сигнала по умолчанию.

3 / Или, если вы решите придерживаться своего первоначального подхода, вы можете издеваться над кнопкой обычным способом mockolate. Пусть ваше представление реализует интерфейс, в котором объявлен геттер для кнопки. Сопоставьте свой посредник с интерфейсом (что в любом случае является хорошей практикой), а не с конкретным типом представления. Таким образом, вы можете назначить ему издевательскую кнопку в тестовом классе, но при этом кнопка будет инкапсулирована лицом к посреднику.

Затем, чтобы смоделированная кнопка отправила событие:

[Mock]
public var mockButton : Button;

//in setup 
view.button = mockButton

//in test
mockButton.dispatch( new MouseEvent( MouseEvent.CLICK ) );
person Creynders    schedule 17.12.2012
comment
Спасибо, Крейндерс, вы действительно помогли мне понять точку зрения.!! Не могли бы вы еще немного объяснить второй вариант, как передать сигнал? - person ThanksBro; 21.12.2012