0

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

假设我有这个 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。

4

2 回答 2

0

在这种情况下,最好重写FormComponentPanel作为泛型类型的子类的类FormComponent<T>。这意味着您可以将新组件视为TextField<String>.

public class MyPanel extends FormComponentPanel<String>

根据我的经验,最好通过FormTester包含Form. 除非提交表单,否则您不会得到转换后的输入。

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

因此我的建议:

  1. 延长FormComponentPanel
  2. 用于FormTester测试您的验证器

于 2013-04-22T12:26:42.003 回答
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));
于 2017-10-05T13:15:13.380 回答