Модульное тестирование компонентов ввода Wicket
Я только что написал свой первый компонент Wicket:) Он содержит ListView
с некоторыми Radio
поля ввода. Теперь я хочу провести модульное тестирование, если выбранное значение попадет в модель.
Как WicketTester.newFormTester("myForm")
ожидает форму, я пытаюсь создать форму на лету:
public void testDataBinding()
{
Model model = ...
MyRadioComponent myRadioComponent = new MyRadioComponent (...);
Form form = new Form("myForm", ...);
form.add(myRadioComponent);
WicketTester wicketTester = new WicketTester();
wicketTester.startComponentInPage(form);
// FormTester formTester = wicketTester.newFormTester("myForm");
// ...
}
Сейчас wicketTester.startComponentInPage(form)
результаты в:
Failed: Component [myForm] (path = [0:x]) must be applied to a tag of type [form],
not: '<span wicket:id="myForm" id="myForm3">'
Любая идея, как это исправить и / или как правильно проверить такой компонент ввода?
2 ответа
Я верю startComponentInPage
использует <span>
для его составляющей. Калитка проверяет, что Form
с прикреплены к <form>
теги, поэтому вы получаете эту ошибку.
Вам нужно создать свою собственную тестовую страницу с <form>
внутри него. Увидеть org.apache.wicket.markup.html.form.NumberTextFieldTest
для примера встроенной разметки. В противном случае создайте класс тестовой страницы Form со связанным html-файлом разметки.
Хорошо, детально решение теперь выглядит так:
public FormTester createFormTester(Component c) {
final WicketTester wicketTester = new WicketTester();
final FormPage page = new FormPage(c);
wicketTester.startPage(page);
return wicketTester.newFormTester(page.getPathToForm());
}
private static class FormPage extends WebPage implements IMarkupResourceStreamProvider {
private final Form<Void> form;
private final Component c;
private FormPage(final Component c) {
this.c = c;
add(form = new Form<>("form"));
form.add(c);
}
public String getPathToForm() {
return form.getPageRelativePath();
}
@Override
public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass) {
return new StringResourceStream(
"<html><body>"
+ "<form wicket:id='" + form.getId() + "'><span wicket:id='" + c.getId() + "'/></form>"
+ "</body></html>");
}
}