1

robotlegs フレームワークを学んでいますが、この質問も一般的な性質だと思います。

View のボタンのイベントをリッスンする Mediator クラスがあり、そのイベントで、View の 2 つの TextField オブジェクトからのプロパティを含む VO を含む信号をディスパッチします。

以下はメディエータークラスです。

ボタンは、ビューにゲッターのみがあり、セッターがないプライベート変数です。

私の質問は、このクラスを単体テストするにはどうすればよいですか? 1.シグナルがディスパッチされているというイベントが発生したかどうかを確認する... 2.シグナルがディスパッチされたときに、正しいVOが含まれていること

モックを使用する必要があることはわかっており、モックレートを使用していますが、ビュークラスのボタンからディスパッチされたイベントをモックする方法がわからないため、円で回転していますか?

手伝ってくれてありがとう

        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);

            }

        }
        }
4

1 に答える 1

0

いくつかの可能性があります:

1/ ボタンを公開せず、メディエーターが直接それを聞くようにします。ビューは、メディエーターがリッスンしている特定の具体的なイベントをディスパッチする必要があります。これは、ユーザーのアクションではなく、ユーザーの意図を説明することが望ましいです。例: ビューが LoginFormViewEvent.LOGIN_REQUESTED または LoginFormViewEvent.CREDENTIALS_PROVIDED イベントをディスパッチするようにします。これが優れている理由は、メディエーターをビューの特定の実装に結び付けないためです。たとえば、後で資格情報がディスパッチされる前に実行する必要がある何らかの検証ルールを追加したい場合があります。ボタンを直接リッスンする場合は、検証ロジックをメディエーターに書き込むことになりますが、これは明確なノーノーであるか、ビューをリファクタリングする必要があります。

メディエーターの仕事は、ビューとシステムの間を仲介することであり、それ以上のものではありません。ビュー内にどの UI 要素があるかを知る必要はありません。ビューからシステムにデータを渡したり、その逆を行ったりするだけです。

2/ もう 1 つの可能性は、メディエーターがシステム全体のシグナルをビューに渡せるようにすることです。これにより、ディスパッチと 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/ または、元のアプローチに固執することを選択した場合は、通常のモックレートの方法でボタンをモックできます。ボタンのゲッターが宣言されているインターフェイスをビューに実装させます。具体的なビュー タイプの代わりに、メディエーターをインターフェイスにマップします (これはとにかく良い方法です)。このようにして、テストクラスでモック化されたボタンをそれに割り当てることができますが、ボタンはメディエーターに向けてカプセル化されています。

次に、モックされたボタンにイベントをディスパッチさせるには:

[Mock]
public var mockButton : Button;

//in setup 
view.button = mockButton

//in test
mockButton.dispatch( new MouseEvent( MouseEvent.CLICK ) );
于 2012-12-17T16:52:27.513 に答える