单元测试中介和机器人视图中的视图2

时间:2012-12-12 14:13:27

标签: unit-testing mocking mediator robotlegs flexunit4

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

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

以下是调解员课程。

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

我的问题是,我将如何对这个班级进行单元测试? 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);

            }

        }
        }

1 个答案:

答案 0 :(得分: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 ) );