首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Robotlegs2中的单元测试中介器和视图

Robotlegs2中的单元测试中介器和视图
EN

Stack Overflow用户
提问于 2012-12-12 22:13:27
回答 1查看 663关注 0票数 1

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

我有一个中介器类,它侦听视图中按钮上的事件,在该事件中,它会发送一个包含VO的信号,该信号包含视图中两个TextField对象的属性。

下面是中介器类。

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

我的问题是,我如何对这个类进行单元测试? 1.为了检查事件是否到来,信号是否被调度……2.当信号被调度时,它包含正确的VO

我知道我需要使用Mock,而且我正在使用mock,但是我在旋转,因为我不知道如何从视图类的按钮模拟调度的事件?

感谢你的帮助

代码语言:javascript
复制
        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);

            }

        }
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-18 00:52:28

有几种可能性:

1/不要暴露按钮,让中介者直接监听。视图应该分派中介者正在监听的特定的、具体的事件,并且最好是描述用户意图,而不是用户动作。例如:让视图分派一个LoginFormViewEvent.LOGIN_REQUESTED或者一个LoginFormViewEvent.CREDENTIALS_PROVIDED事件。这样做更好的原因是,它不会将您的中介器绑定到视图的特定实现。例如,可能以后您想要添加某种验证规则,该规则需要在分发凭据之前运行。如果您直接监听按钮,您要么将验证逻辑写入到中介器中,这是绝对不允许的,要么您将需要重构您的视图。

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

2/另一种可能性是让中介器将系统范围的信号传递给视图,视图执行调度和VO填充。

代码语言:javascript
复制
//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 );
}

我倾向于使信号有条件地实例化和泛型,以使视图更容易重用。如下所示:

代码语言:javascript
复制
//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。将您的中介器映射到接口(这是一个很好的实践),而不是具体的视图类型。这样,您就可以在测试类中为其分配一个模拟按钮,同时使该按钮面向中介器进行封装。

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

代码语言:javascript
复制
[Mock]
public var mockButton : Button;

//in setup 
view.button = mockButton

//in test
mockButton.dispatch( new MouseEvent( MouseEvent.CLICK ) );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13841679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档