Тестирование докладчиков в приложении MVP GWT - PullRequest
9 голосов
/ 07 июля 2011

У меня есть простое приложение, и я хочу сделать его тестируемым. Я новичок в этой области. Вот простой докладчик, принимая во внимание этот код, вы могли бы посоветовать или привести пример, как его протестировать

    public class SomePresenter extends Presenter<MainPanelPresenter.Display>
    {

    public interface Display extends WidgetDisplay
    {
      HasClickHandlers getAddButton();

      HasClickHandlers getDeleteButton();

      void setData(ArrayList<Person> data);

      ArrayList<String> getSelectedRows();

      Widget asWidget();

    }

    private final DispatchAsync dispatcher;
    public static final Place PLACE = new Place("main");

    @Inject
    public SomePresenter(DispatchAsync dispatcher, EventBus eventBus, Display display)
    {
      super(display, eventBus);
      this.dispatcher = dispatcher;
      bind();
    }

    protected void onBind()
    {
      display.getAddButton().addClickHandler(new ClickHandler()
      {
        public void onClick(ClickEvent event)
        {
          eventBus.fireEvent(new AddButtonEvent());
        }
      });

      display.getDeleteButton().addClickHandler(new ClickHandler()
      {
        public void onClick(ClickEvent event)
        {
          ArrayList<String> list = display.getSelectedRows();
          deletePerson(list);
        }
      });
    }
    ....
    private void loadDbData()
    {
     ..........
    }
    private void deletePerson(ArrayList<String> ids)
    {
     ..........
     }
   }

Edit:

Что такое Presenter, загружает исходные данные из базы данных, имеет 2 кнопки добавления и удаления. Когда добавить, нажмите, то новая форма загружается, и пользователь может вводить данные и сохранять в БД, Удалить кнопку просто удалить человека из БД.

Спасибо

1 Ответ

5 голосов
/ 09 июля 2011

Общая идея модульного тестирования такого класса будет такой же, как и для любого другого класса:

  • создание Mock-версии зависимостей (Display, EventBus и т. Д.)
  • установить ожидания относительно того, что должны делать зависимости при работе докладчика
  • тренируй Ведущего и проверяй ожидания

Однако есть несколько проблем с вашей версией Presenter:

  • Метод loadDbData () не показан, но я предположил, что это означает, что Presenter также имеет доступ к некоторому другому компоненту, который выполняет выборку. Может ли этот компонент быть извлечен в зависимости, и высмеивать понравился остальным?

  • Затем идет проверка bind (). Единственная ответственность вашего докладчика в этом методе заключается в настройке обратных вызовов для некоторых кнопок, предоставляемых дисплеем. То, что вы хотите проверить, это:

    • что обратные вызовы установлены
    • что установленные обратные вызовы делают ожидаемые вещи

Несколько идей, которые помогут позже:

Вы можете уменьшить связь между Presenter и Button. Если возможно, измените интерфейс дисплея с:

Button getAddButton();

до

addAddButtonClickedHandler(ClickHandler);

Это означает, что вашему докладчику не нужно использовать объект Display, который возвращает фактический BUtton

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

protected void bind() {
   display.addAddButtonClickHandler(new ClickHandler() {
       public void onClick(ClickEvent) {
          fireAdded();
       } 
   });
} 

// The fireAdded function can be tested independenty of the Display, potentially with 
// a mock EventBus
protected void fireAdded() {
   event.fireEvent(....)
}

Если вы действительно хотите проверить, правильно ли установлены обратные вызовы, вы можете использовать «фиктивную» реализацию класса Display, которая предоставит вам список всех обратных вызовов и позволит вам вызывать их

private class DummyDisplay implements Display  {

   private List<ClickHandler> addButtonClickHandlers;
   public void addAddButtonClickHandler(ClickHandler handler) {
       addButtonClickHandlers.add(handler);
   }
   public void fireAddButtonClick() {
       for (ClickHandler h in addButtonClickHandlers) {
              h.onClick(new ClickEvent());
       }
   }
   // .... 
}

Тогда ваш тест будет:

  • создать докладчика с таким фиктивным дисплеем
  • используйте bind для установки обратных вызовов
  • используйте display.fireAddButtonClick () для имитации нажатия пользователем
  • проверка, которая имеет результат нажатия, видны эффекты fireAdded

Этот тип класса (который в основном склеивает другие классы) может быть сложным для тестирования; в какой-то момент, если другие классы будут тщательно протестированы, он может стать немного контрпродуктивным, сконцентрировавшись на клеях, а не на клеях.

Надеюсь, это поможет.

...