Протестируйте вход без WicketForm

У меня есть панели, которые создают поля ввода и которые включают в форму в другой панели, создающей форму. Моя проблема в том, что я не вижу, как выполнить модульное тестирование моей панели.

Допустим, у меня есть эта 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 ответа

У меня была та же проблема, и я не нашел удовлетворительного ответа ни здесь, ни где-либо еще. Вопрос был задан четыре года назад, но я нашел решение и поделюсь им, хотя человек, который спросил, давно перешел, он все же может помочь другим. Я предпочитаю иметь небольшие компоненты и тестировать их, а формы могут быть большими и сложными, и это отразится на тесте, если форма находится в одном файле. А как проверить?

Хитрость заключается в том, чтобы сдать и поместить ваш компонент в форму.

Я сделал небольшой компонент, который доступен только для тестов (в настоящее время он находится в моей папке 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));

В этой ситуации лучше переопределить класс FormComponentPanel, который является подклассом универсального типа FormComponent<T>, Это означает, что вы можете обращаться с вашим новым компонентом так же, как, например, с экземпляром TextField<String>,

public class MyPanel extends FormComponentPanel<String>

Исходя из моего опыта, лучше всего тестировать компоненты формы FormTester на содержании Form, Вы не получите преобразованный ввод, если форма не отправлена.

То, что вы можете сделать для возможности тестирования без отправки формы, это добавить поведение, реагирующее на функцию "onupdate" Javascript: AjaxFormComponentUpdatingBehavior, но тогда вам придется прочитать входные данные из Javascript и конвертировать его самостоятельно.

Таким образом, моя adivce:

  1. простираться FormComponentPanel
  2. использование FormTester проверить ваши валидаторы

Другие вопросы по тегам