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