2

我刚刚编写了我的第一个 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">'

知道如何解决这个问题和/或如何以正确的方式测试这样的输入组件吗?

4

2 回答 2

4

好的,详细的解决方案现在看起来像这样:

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>");
    }
}
于 2014-04-23T18:40:42.230 回答
3

我相信startComponentInPage使用 a<span>作为它的组件。Wicket 检查Forms 是否附加到<form>标签,这就是您收到此错误的原因。

您需要在其中创建自己的测试页面<form>。有关org.apache.wicket.markup.html.form.NumberTextFieldTest内联标记的示例,请参阅。否则,使用关联的 html 标记文件创建一个表单测试页类。

于 2014-04-17T17:06:19.310 回答