0

私は次のようなGWTTestCaseを作成しました。

public void testClickButton() {
    SampleView view = new SampleView();
    RootPanel.get().add(view);
    view.textBox.setText("Saeed Zarinfam");

    assertEquals("", view.label.getText());

//        ButtonElement.as(view.button.getElement()).click();
    view.button.getElement().<ButtonElement>cast().click();

    assertEquals("Bean \"OCTO\" has been created", view.label.getText());
}

このテストを実行すると、サーブレットに接続します(サーブレットにログを追加しました)が、RPCコールバックが私のサーブレットを呼び出しませんSampleView。junitは次のように言います。

expected: <Bean "OCTO" has been created>, actual: <>

これは、ボタンクリックハンドラーでの私のコールバックです。

@UiHandler("button")
void onClick(ClickEvent e) {

    labelTest.setText("click button");

    AsyncCallback<FooBean> callback = new AsyncCallback<FooBean>() {
        public void onFailure(Throwable caught) {
            // Show the RPC error message to the user
            labelTest.setText("call fail");
            label.setText("Failure : " + caught.getMessage());
        }

        public void onSuccess(FooBean result) {
            labelTest.setText("call success");
            label.setText("Bean \"" + result.getName() + "\" has been created");
        }
    };

    // Make the call. Control flow will continue immediately and later
    // 'callback' will be invoked when the RPC completes.
    service.createBean("OCTO", callback);


}

この場合、GWT rpcコールバックが呼び出されないのはなぜですか?

4

1 に答える 1

1

RPC 呼び出しは、でも非同期GWTTestCaseです。delayTestFinish()テストが非同期であることをランナーに伝えるために呼び出しfinish()、「将来のある時点で」呼び出して、テストが完了してOKであることを伝える必要があります(そうしないと、タイムアウトが発生します)。

あなたの場合、呼び出し元のコードは RPC 呼び出しがいつ終了したかを知る方法がないため、どれくらいの時間がかかるかを推測して使用することしかできませんTimer
私に尋ねたら、コードをリファクタリングして、よりテストしやすくします (注: Selenium はほぼ同じように機能します: タイムアウトになるまで毎秒条件をチェックしてください。 http://seleniumhq.org/docs/02_selenium_ide.jsp#the-waitfor -commands-in-ajax-applicationsTimer 、条件が満たされない場合に最大 N 回再スケジュールするのと同じように)

https://developers.google.com/web-toolkit/doc/latest/DevGuideTesting#DevGuideAsynchronousTestingを参照してください

于 2013-01-07T11:13:58.143 に答える