Unit testing robotlegs 2中的单元测试中介和视图
我正在学习机器人腿框架,但这个问题也是我认为的一般性质 我有一个中介类,它监听视图中按钮上的事件,并在该事件上发送一个包含VO的信号,VO包含视图中两个TextField对象的属性 下面是中介类 button是一个私有变量,在视图中只有getter而没有setter 我的问题是,我如何对这个类进行单元测试? 1.要检查事件是否发生,信号是否正在发送。。。 2.当信号被调度时,它包含正确的VO 我知道我需要使用Mock,并且我正在使用mokolate,但我在循环,因为我不知道如何从视图类的按钮模拟已调度事件 谢谢你的帮助Unit testing robotlegs 2中的单元测试中介和视图,unit-testing,mocking,mediator,robotlegs,flexunit4,Unit Testing,Mocking,Mediator,Robotlegs,Flexunit4,我正在学习机器人腿框架,但这个问题也是我认为的一般性质 我有一个中介类,它监听视图中按钮上的事件,并在该事件上发送一个包含VO的信号,VO包含视图中两个TextField对象的属性 下面是中介类 button是一个私有变量,在视图中只有getter而没有setter 我的问题是,我如何对这个类进行单元测试? 1.要检查事件是否发生,信号是否正在发送。。。 2.当信号被调度时,它包含正确的VO 我知道我需要使用Mock,并且我正在使用mokolate,但我在循环,因为我不知道如何从视图类的按钮模拟
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/不要打开按钮,让调解人直接听。视图应该发送一个特定的、具体的事件,调解人正在监听该事件,最好描述用户意图,而不是用户操作。例如:让视图发送一个请求的LoginFormViewEvent.LOGIN\u或可能是LoginFormViewEvent.CREDENTIALS\u提供的事件。 这样做更好的原因是它不会将中介程序与视图的特定实现绑定在一起。例如,以后可能需要添加某种验证规则,这些规则需要在发送凭据之前运行。如果您直接听这个按钮,您要么将验证逻辑写入中介,这是一个明确的否,要么您需要重构您的视图 中介的工作是在视图和系统之间进行中介,仅此而已。它不需要知道视图中有哪些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 ) );
谢谢Creynders,你真的帮助我理解了这个观点。!!你能再解释一下选项二,如何传递信号吗?