簡體   English   中英

兩個綁定失敗的TextInput文本更改的Flexunit測試

[英]Flexunit test of TextInput text change with two binding failing

我正在嘗試為flex視圖編寫單元測試。 TextInput reportName和屬性_parameters之間有兩種綁定。 當我運行代碼時,綁定工作正常,但是測試失敗。 以下是以類似方式失敗的許多測試之一。 測試失敗,並顯示以下消息:

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

我想我只需要睡一會兒。 我的測試失敗的原因是雙向綁定僅在您將它們指定為雙向綁定時才可以用作雙向綁定。

錯誤(單向綁定):

 text="{_parameters.reportName}"

正確(雙向綁定:

 text="@{_parameters.reportName}"

適當地指定兩個綁定是使事情正常進行所需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM