我刚刚编写了我的第一个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">'
知道如何解决这个问题和/或如何以正确的方式测试这样的输入组件?
答案 0 :(得分:3)
我相信startComponentInPage
使用<span>
作为其组件。 Wicket会检查Form
标记是否附加到<form>
标记,这就是您收到此错误的原因。
您需要创建自己的测试页面,其中包含<form>
。有关内联标记的示例,请参阅org.apache.wicket.markup.html.form.NumberTextFieldTest
。否则,使用关联的html标记文件创建一个Form测试页面类。
答案 1 :(得分:3)
好的,详细解决方案现在看起来像这样:
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>");
}
}