2013-10-14 33 views
0

我想爲flex中的視圖編寫單元測試。 TextInput,reportName和屬性_parameters之間存在雙向綁定。當我運行代碼時,綁定工作正常,但測試失敗。下面是許多以類似方式失敗的測試之一。測試失敗,出現以下消息:Flexunit測試的TextInput文本更改兩個綁定失敗

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

parameters_changeHandler()跟蹤消息顯示如下:

parameters_changeHandler 
_parameters.reportName defaultTitle 
reportName.text newName 

所以將TextInput,reportName,被正確更新,但我設置文本的方式在測試中它是取消綁定,至少我認爲這是問題。

如何維護兩個綁定並仍然更新值?有另一種模擬用戶輸入數據的方式嗎?

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}" 

正確指定兩個結合是需要把事情所有工作。