2012-12-12 2 views
1

나는 robotlegs 프레임 워크를 배우고있다. 그러나이 질문 또한 일반적인 성격이라고 생각한다.로봇 테스팅의 중재자와 뷰 2

저는 View의 버튼에 이벤트를 수신하는 Mediator 클래스를 가지고 있으며,이 이벤트에서 View의 두 TextField 객체의 적합성을 포함하는 VO를 포함하는 신호를 전달합니다.

아래는 중재자 클래스입니다.

button은보기에 getter 및 setter 만있는 개인 변수입니다.

내 질문은이 단위 테스트를 어떻게하면 좋을까요? 이벤트가 신호가 전달되고 있음을 오면 1.은 내가 모의를 사용할 필요가 있음을 알고

올바른 VO를 포함, 2. 신호가 전달 될 때 ... 확인, 나는 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

에 대한

감사 :

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

Thankx Creynders을, 당신은 정말 나를보기를 이해하는 데 도움!.신호를 전달하는 방법에 대해 더 많은 옵션 2를 설명 할 수 있습니까? – ThanksBro

+0

에 코드 예제를 추가했습니다. 2/ – Creynders

+0

오 ok :) 완료되었습니다. – ThanksBro