我正在学习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);
}
}
}
答案 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 ) );