0

Flex でビューの単体テストを作成しようとしています。reportNameTextInputとプロパティ の間には双方向バインディングがあります_parameters。コードを実行するとバインディングは正常に機能しますが、テストは失敗します。以下は、同様の方法で失敗する多くのテストの 1 つです。テストは失敗し、次のメッセージが表示されます。

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

のトレース メッセージからparameters_changeHandler()、次のことがわかります。

parameters_changeHandler
_parameters.reportName defaultTitle
reportName.text newName

したがって、TextInputreportNameは正しく更新されていますが、テストでテキストを設定する方法はバインディングを元に戻すことです。少なくともそれが問題だと思います。

2 バインディングを維持しながら値を更新するにはどうすればよいですか? ユーザーのデータ入力をシミュレートする別の方法はありますか?

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

1 に答える 1

0

私はそれで寝る必要があったと思います。私のテストが失敗した理由は、双方向バインディングとして指定した場合、双方向バインディングが双方向バインディングとしてのみ機能するためです。

間違い (一方向バインディング):

 text="{_parameters.reportName}"

正しい (双方向バインディング:

 text="@{_parameters.reportName}"

2 つのバインディングを適切に指定するだけで、動作させることができました。

于 2013-10-15T17:20:35.147 に答える