Модульное тестирование компонентов ввода 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>");
    }
}
Другие вопросы по тегам