我正在学习robotlegs框架,但这个问题也是我思考的一般性问题。
我有一个中介器类,它侦听视图中按钮上的事件,在该事件中,它会发送一个包含VO的信号,该信号包含视图中两个TextField对象的属性。
下面是中介器类。
button是一个私有变量,在View中只有getter,没有setter。
我的问题是,我如何对这个类进行单元测试? 1.为了检查事件是否到来,信号是否被调度……2.当信号被调度时,它包含正确的VO
我知道我需要使用Mock,而且我正在使用mock,但是我在旋转,因为我不知道如何从视图类的按钮模拟调度的事件?
感谢你的帮助
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);
}
}
}发布于 2012-12-18 00:52:28
有几种可能性:
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 ) );https://stackoverflow.com/questions/13841679
复制相似问题