1

我正在学习robotlegs框架,但是这个问题也是我想到的一般性。

我有一个 Mediator 类,它侦听 View 中按钮上的事件,并在该事件上调度一个包含 VO 的信号,该信号包含 View 中两个 TextField 对象的属性。

下面是中介类。

button 是一个私有变量,在 View 中只有 getter 而没有 setter。

我的问题是,我将如何对这门课进行单元测试?1. 检查事件是否发生,Signal 正在被分派... 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);

            }

        }
        }
4

1 回答 1

0

有几种可能:

1/不要暴露按钮,让中介直接听。视图应该调度一个特定的、具体的事件,调解器正在侦听,最好这描述用户意图,而不是用户操作。例如:让视图调度 LoginFormViewEvent.LOGIN_REQUESTED 或 LoginFormViewEvent.CREDENTIALS_PROVIDED 事件。这样做更好的原因是它不会将您的调解器与您的视图的特定实现联系起来。例如,也许稍后您想添加某种需要在发送凭据之前运行的验证规则。如果您直接收听按钮,您要么将验证逻辑写入中介,这是绝对不行的,要么您需要重构您的视图。

调解员的工作是在视图和系统之间进行调解,仅此而已。它不需要知道视图中有哪些 UI 元素,只需将数据从视图传递到系统,反之亦然。

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/ 或者,如果您选择坚持原来的方法,您可以以正常的模拟方式模拟按钮。让您的视图实现一个接口,其中声明了按钮的 getter。将您的调解器映射到界面(无论如何这是一个好习惯)而不是具体的视图类型。这样,您可以在测试类中为其分配一个模拟按钮,但将按钮封装为面向中介。

然后,让模拟按钮调度事件:

[Mock]
public var mockButton : Button;

//in setup 
view.button = mockButton

//in test
mockButton.dispatch( new MouseEvent( MouseEvent.CLICK ) );
于 2012-12-17T16:52:27.513 回答