在没有WicketForm的情况下测试输入

时间:2013-04-22 08:16:43

标签: forms wicket-1.5 wicket-tester

我有创建输入字段的面板,并且在创建表单的另一个面板中包含在表单中。我的问题是我看不到如何对我的面板进行单元测试。

假设我有这个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 个答案:

答案 0 :(得分:0)

在这种情况下,最好覆盖类FormComponentPanel,它是泛型类型FormComponent<T>的子类。这意味着您可以将新组件视为例如TextField<String>的实例。

public class MyPanel extends FormComponentPanel<String>

根据我的经验,最好在包含FormTester的{​​{1}}上测试表单组件。除非提交表单,否则您无法获得转换后的输入。

如果能够在没有表单提交的情况下进行测试,您可以做的是添加Form对Javascript'onupdate'函数做出反应的行为,但是您必须从Javascript读取输入并转换它自己。

因此,我的adivce:

  1. 延长AjaxFormComponentUpdatingBehavior
  2. 使用FormComponentPanel测试您的验证工具

答案 1 :(得分:0)

我遇到了同样的问题,但在这里或其他任何地方找不到令人满意的答案。这个问题是在四年前提出来的,但是我找到了一个解决方案,并且会分享它,即使那个问过很久以前的人,也可能会帮助别人。 我更喜欢使用小组件并测试它们,并且表单可能很大且很复杂,如果表单在一个文件中,它将反映在测试中。但是如何测试?

诀窍是让你的组件放入表格中。

我制作了一个只能用于测试的小组件(目前在我的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));