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