Протестируйте вход без WicketForm
У меня есть панели, которые создают поля ввода и которые включают в форму в другой панели, создающей форму. Моя проблема в том, что я не вижу, как выполнить модульное тестирование моей панели.
Допустим, у меня есть эта Java:
public class MyPanel extends Panel {
public MyPanel(String id, IModel model) {
super(id, model);
TextField<String> test = new TextField<String>("test");
test.add(new StringValidator.MaximumLengthValidator(5));
add(test);
}
}
И HTML:
<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns:wicket>
<head></head>
<body>
<wicket:panel>
<p>
<label wicket:for="test"> <wicket:message key="test" />
</label> <input type="text" wicket:id="test" />
</p>
</wicket:panel>
</body>
</html>
Есть ли способ сделать модульный тест, который может проверить мой MaximumLengthValidator? Поскольку панель не содержит форму, я не могу напрямую использовать FormTester, а WicketTester, похоже, не использует Validator.
2 ответа
У меня была та же проблема, и я не нашел удовлетворительного ответа ни здесь, ни где-либо еще. Вопрос был задан четыре года назад, но я нашел решение и поделюсь им, хотя человек, который спросил, давно перешел, он все же может помочь другим. Я предпочитаю иметь небольшие компоненты и тестировать их, а формы могут быть большими и сложными, и это отразится на тесте, если форма находится в одном файле. А как проверить?
Хитрость заключается в том, чтобы сдать и поместить ваш компонент в форму.
Я сделал небольшой компонент, который доступен только для тестов (в настоящее время он находится в моей папке src/test/java, но я мог бы переместить его в другой модуль и зависеть от того, будет ли он импортирован с областью тестирования, если мне понадобится больше модулей в проекте). С помощью этого небольшого справочного класса я могу тестировать свои различные компоненты, которые будут в форме, когда приложение запускается, и которые должны быть проверены внутри формы.
Это обходной путь, но я чувствую, что я и рамки встретились на полпути.
public class FormPanel extends Panel {
private final Component iNeedToBeInAForm;
public FormPanel(String id, IModel<?> model, Component iNeedToBeInAForm) {
super(id, model);
this.iNeedToBeInAForm = iNeedToBeInAForm;
}
@Override
protected void onInitialize() {
super.onInitialize();
final Form form = new Form("form", getDefaultModel());
form.add(iNeedToBeInAForm);
add(form);
}
}
и HTML, используемый с этим:
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<body>
<wicket:panel>
<form wicket:id="form">
<div wicket:id="panel" id="panel">
</div>
</form>
</wicket:panel>
</body>
</html>
В тестах я использую это так:
panel = new MyPanel("panel", model);
tester.startComponentInPage(new FormPanel("id", model, panel));
final FormTester formTester = tester.newFormTester("id:form");
formTester.setValue("panel:" + MyPanel.id_BETA_BLOCKAD_DOSAGE_START_SELECT, DEFAULT.toString());
tester.executeAjaxEvent("id:form:panel:" + MyPanel.id_BETA_BLOCKAD_DOSAGE_START_SELECT, "onchange");
Result result = tester.isVisible("id:form:panel:" + MyPanel.id_BETA_BLOCKAD_DOSAGE_START_TEXT);
assertThat(result.wasFailed(), is(true));
В этой ситуации лучше переопределить класс FormComponentPanel
, который является подклассом универсального типа FormComponent<T>
, Это означает, что вы можете обращаться с вашим новым компонентом так же, как, например, с экземпляром TextField<String>
,
public class MyPanel extends FormComponentPanel<String>
Исходя из моего опыта, лучше всего тестировать компоненты формы FormTester
на содержании Form
, Вы не получите преобразованный ввод, если форма не отправлена.
То, что вы можете сделать для возможности тестирования без отправки формы, это добавить поведение, реагирующее на функцию "onupdate" Javascript: AjaxFormComponentUpdatingBehavior
, но тогда вам придется прочитать входные данные из Javascript и конвертировать его самостоятельно.
Таким образом, моя adivce:
- простираться
FormComponentPanel
- использование
FormTester
проверить ваши валидаторы