2013-10-14 8 views
0

flex의 뷰에 대한 단위 테스트를 작성하려고합니다. TextInput, reportName 및 속성 인 _parameters 사이에는 양방향 바인딩이 있습니다. 코드를 실행할 때 바인딩이 제대로 작동하지만 테스트가 실패합니다. 아래는 비슷한 방법으로 실패하는 많은 테스트 중 하나입니다.두 개의 바인딩을 사용하여 TextInput 텍스트의 Flexunit 테스트가 변경되지 않습니다.

parameters_changeHandler 
_parameters.reportName defaultTitle 
reportName.text newName 
그래서

의 TextInput, reportName, 제대로 업데이트되고 있지만, 방법 나는 텍스트를 설정하고있다 : parameters_changeHandler()

Error: Expected: "newName" 
but: was "defaultTitle" 

추적 메시지는 다음과 같은 공개 : 시험은 다음과 같은 메시지와 함께 실패 그것의 테스트에서 바인딩을 취소, 적어도 나는 그것이 문제라고 생각합니다.

두 바인딩을 유지 관리하고 값을 업데이트하는 방법은 무엇입니까? 사용자가 데이터를 입력하는 다른 방법이 있습니까?

View.mxml :

<fx:Script> 
     <![CDATA[ 
      import events.events.UpdatePointRadiusReportModalParametersEvent; 
      import model.LocationAnalysisParameters; 

      [Bindable] 
      internal var _parameters:LocationAnalysisParameters; 

      public function set parameters(parameters:LocationAnalysisParameters):void 
      { 
       this._parameters = parameters; 
      } 

      public function get parameters():LocationAnalysisParameters 
      { 
       return _parameters; 
      } 

      protected function parameters_changeHandler():void 
      { 
       trace('parameters_changeHandler'); 
       trace('_parameters.reportName', _parameters.reportName); 
       trace('reportName.text', reportName.text); 
       dispatchEvent(new UpdatePointRadiusReportModalParametersEvent(_parameters)); 
      } 
     ]]> 
    </fx:Script> 

    <s:VGroup> 
     <s:Label id="reportNameLabel" 
      styleName="toolStyle" 
      text="Report Name:"/> 
     <s:TextInput id="reportName" 
      width="100%" 
      maxChars="50" 
      minWidth="200" 
      styleName="toolStyle" 
      text="{_parameters.reportName}" 
      change="parameters_changeHandler()" 
      restrict="a-zA-Z0-9 \-_"/> 
    </s:VGroup> 

</components:FlyoutPanel> 

LocationAnalysisParameters.as

package model 
{ 
    import utils.StringUtils; 

    [Bindable] 
    public class LocationAnalysisParameters 
    { 
     public var reportName:String; 

     public var reportDescription:String; 

     public function reset():void 
     { 
      reportName = null; 
      reportDescription = null; 
     } 

     public function isValid():Boolean 
     { 
      return !StringUtils.isNullOrEmpty(reportDescription) && !StringUtils.isNullOrEmpty(reportName); 
     } 

     public function clone():LocationAnalysisParameters 
     { 
      const c:LocationAnalysisParameters = new LocationAnalysisParameters(); 
      c.reportName = reportName; 
      c.reportDescription = reportDescription; 
      return c; 
     } 
    } 
} 

ViewTest.as 패키지 전망 {

public class PointRadiusReportPopupViewTest 
    { 

     private var popupView:PointRadiusReportPopupView; 


     [Before(async, ui)] 
     public function setUp():void 
     { 
      popupView = new PointRadiusReportPopupView(); 
      Async.proceedOnEvent(this, popupView, FlexEvent.CREATION_COMPLETE); 
      UIImpersonator.addChild(popupView); 
     } 

     [After(ui)] 
     public function tearDown():void 
     { 
      UIImpersonator.removeChild(popupView); 
      popupView = null; 
     } 

     [Test(async, ui)] 
     public function reportNameChangeShouldDispatchUpdatePointRadiusReportModalParametersEvent():void 
     { 
      //arrange 
      const parameters:LocationAnalysisParameters = new LocationAnalysisParameters(); 
      parameters.reportName = 'defaultTitle'; 
      parameters.reportDescription = 'defaultDescription'; 
      popupView.parameters = parameters; 
      const expectedParameters:LocationAnalysisParameters = new LocationAnalysisParameters(); 
      expectedParameters.reportName = 'newName'; 
      expectedParameters.reportDescription = 'defaultDescription'; 

      //act 
      Async.handleEvent(this, popupView, UpdatePointRadiusReportModalParametersEvent.TYPE, assertUpdatePointRadiusReportModalParametersEvent, 500, expectedParameters); 
      updateTextInput(popupView.reportName, 'newName'); 
     } 

     private function assertUpdatePointRadiusReportModalParametersEvent(evt:UpdatePointRadiusReportModalParametersEvent, expectedParameters:LocationAnalysisParameters):void 
     { 
      assertThat(evt.parameters.reportName, equalTo(expectedParameters.reportName)); 
      assertThat(evt.parameters.reportDescription, equalTo(expectedParameters.reportDescription)); 
     } 

     /** 
     * Helpers 
     */ 

     internal static function updateTextInput(compontent:TextInput, value:String):void 
     { 
      compontent.text = value; 
      const event:TextOperationEvent = new TextOperationEvent(TextOperationEvent.CHANGE, false, true); 
      compontent.dispatchEvent(event); 
     } 
    } 
} 

답변

0

난 그냥에 잠을하기 위해 필요한 것 같아요 그것. 내 테스트가 실패한 이유는 양방향 바인딩이 양방향 바인딩으로 지정 될 때 양방향 바인딩으로 만 작동한다는 것입니다.

WRONG (바인딩 편도) :

text="{_parameters.reportName}" 

올바른 (양방향 바인딩 :

text="@{_parameters.reportName}" 

가 제대로 바인딩이 지정은 사물이 작동하기 위해 필요했던 모든 것을했다.