私の Wicket アプリケーションでは、「はい」と「いいえ」のオプションを持つラジオ ボタンを 1 つ使用しました。「いいえ」を選択すると、ドロップダウンの選択肢が 1 つ表示されます。を使ってコードを書きAjaxFormChoiceComponentUpdatingBehavior
ました。WicketTester を使用してこれを単体テストするにはどうすればよいですか?
6 に答える
Wicket 1.5.x の解決策:
AbstractAjaxBehavior behavior = (AbstractAjaxBehavior)WicketTesterHelper.
findBehavior(getTester().getComponentFromLastRenderedPage("path:to:component"),
AjaxFormChoiceComponentUpdatingBehavior.class);
getTester().executeBehavior(behavior);
これは私のコードで、選択ボックスで完全に機能しますが、Behavior クラスを変更すると、ラジオ ボタンでも同様に動作するはずです。必要な手順は次のとおりです。
- フォームに新しい値を挿入する (FormTester を使用)
- 行動を見つける
- 変更時に動作を実行する
コードの例を次に示します。
//simulate insert new value
FormTester formTester = tester.newFormTester(PANEL_ID + FORM);
formTester.setValue("selectBox", "newValue");
//Find onchange behaviour
AjaxFormComponentUpdatingBehavior behavior =
(AjaxFormComponentUpdatingBehavior) WicketTesterHelper.findBehavior(
tester.getComponentFromLastRenderedPage(PANEL_ID + FORM + ":" + "selectBox"),
ajaxFormComponentUpdatingBehavior.class);
//execute onchange
tester.executeBehavior(behavior);
以前の回答でフォームの値を更新する方法を見逃しました。
ラジオボタンがフォーム上にある場合は、FormTesterクラスを使用する必要があると思います。
http://wicket.apache.org/apidocs/1.4/org/apache/wicket/util/tester/FormTester.html
Ajaxフォーム送信テストの例については、以下をご覧ください。
これは、少なくとも Wicket 1.4 (1.5 では試していません) では、多少の苦痛を伴います。
ウェブ検索で、Mischa Dasberg のブログにヒントが見つかりました。基本的に、使用してBaseWicketTester.executeAjaxEvent((String componentPath, String event)
いる動作が ではないためメソッドを使用できず、リクエスト パラメータが消去されるため をAjaxEventBehavior
使用できません。BaseWicketTester.executeBehavior(final AbstractAjaxBehavior behavior)
Mischa の解決策はexecuteBehavior
、親テスト ケースに独自のメソッドを実装することでした。これは、彼の状況では機能しましたが、要求パラメーター ID が完全なコンポーネント パスと同じであると想定していたため、私のニーズには対応していませんでした。
executeAjaxBehavior
の拡張子に独自のものを実装することで同様のことを行いましたWicketTester
が、(私の場合もそうですが) リクエスト パラメータがコンポーネント パスの最後の ":" で区切られたセクションであると仮定します。
public void executeAjaxBehavior(String path, String value) {
AbstractAjaxBehavior behavior = (AbstractAjaxBehavior) getComponentFromLastRenderedPage(path).getBehaviors().get(0);
CharSequence url = behavior.getCallbackUrl(false);
WebRequestCycle cycle = setupRequestAndResponse(true);
getServletRequest().setRequestToRedirectString(url.toString());
String[] ids = path.split(":");
String id = ids[ids.length-1];
getServletRequest().setParameter(id, value);
processRequestCycle(cycle);
}
彼の解決策と私の (彼に基づく) 両方とも、動作がコンポーネントの最初の (または唯一の) 動作であると想定しています。
これは少し不格好ですが、このようなものがうまくいくかもしれません。
ID と動作が別々に取得され、パラメーターとして渡された方がよい場合があります。もちろん、最初の動作であるAjaxFormChoiceComponentUpdatingBehavior
と軽々しく想定するのではなく、実際にあった最初の動作を見つける方がよい場合もありますが、これは始まりです。
これは、他の動作テスト メソッドのクラス内にあるものと同様のコードでBaseWicketTester
あり、調べる価値があるかもしれません。
次のようなことを試してください:
tester.executeAjaxEvent("form:myRadioButtonId", "onchange");