Как проверить AjaxFormChoiceComponentUpdatingBehavior в WicketTester
В моем приложении Wicket я использовал одну радиокнопку с опциями "да" и "нет". Если я выберу "Нет", я должен отобразить один выпадающий выбор. Я написал код используя AjaxFormChoiceComponentUpdatingBehavior
, Как мне протестировать это с помощью WicketTester?
6 ответов
Решение для Wicket 1.5.x:
AbstractAjaxBehavior behavior = (AbstractAjaxBehavior)WicketTesterHelper.
findBehavior(getTester().getComponentFromLastRenderedPage("path:to:component"),
AjaxFormChoiceComponentUpdatingBehavior.class);
getTester().executeBehavior(behavior);
Сначала выберите переключатель, который вы хотите.
form.select("path to radio button", 0/1)
Затем выполните поведение ajax:
tester.executeBehavior((AbstractAjaxBehavior)tester.getComponentFromLastRenderedPage("path to radio buttons").getBehaviors().get(0));
Вот мой кусок кода, который отлично работает для меня с полем выбора, но должен также указывать переключатель, если вы измените класс поведения. Необходимые шаги:
- Вставьте новое значение в форму (используйте 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);
Я пропустил пар, как обновить значение формы в предыдущих ответах.
Попробуйте что-то вроде этого:tester.executeAjaxEvent("form:myRadioButtonId", "onchange");
Если переключатель находится на форме, я думаю, что вы должны использовать класс FormTester:
http://wicket.apache.org/apidocs/1.4/org/apache/wicket/util/tester/FormTester.html
Для примера теста отправки формы Ajax вы можете взглянуть на:
Это оказывается несколько болезненным, по крайней мере, в Wicket 1.4 (я не пробовал с 1.5).
С помощью поиска в Интернете я нашел подсказки в блоге Миши Дасберга. По сути, вы не можете использовать BaseWicketTester.executeAjaxEvent((String componentPath, String event)
метод, потому что поведение, которое вы используете, не является AjaxEventBehavior
и вы не можете использовать BaseWicketTester.executeBehavior(final AbstractAjaxBehavior behavior)
потому что это стирает параметры запроса.
Решением Миши было реализовать собственное executeBehavior
Метод в родительском тестовом примере, который работал для его ситуации, но не для моей необходимости, так как предполагал, что идентификатор параметра запроса совпадает с полным путем к компоненту.
Я сделал нечто подобное, реализовав свой собственный 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);
}
И его решение, и мое (на основе его) также предполагают, что поведение является первым (или единственным) в компоненте.
Это немного неуклюже, но что-то вроде этого может работать для вас.
Возможно, было бы лучше, если бы идентификаторы и поведение были получены отдельно и передавались как параметры, и, конечно, вы могли бы найти первое поведение, которое на самом деле было AjaxFormChoiceComponentUpdatingBehavior
вместо того, чтобы беспечно предполагать, что это было первое поведение, но это начало.
Это также код, аналогичный тому, что внутри BaseWicketTester
класс для других методов тестирования поведения, которые, возможно, стоит посмотреть.