簡體   English   中英

在 MVP GWT 應用程序中測試演示者

[英]Testing Presenters in MVP GWT application

我有一個簡單的應用程序,並希望使其可測試。 我是這個領域的新手。 這是一個簡單的演示者,考慮到這段代碼,你能給我建議或給我一些如何測試它的例子。

    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)
    {
     ..........
     }
   }

編輯:

Presenter 是什么,從數據庫加載初始數據,有 2 個按鈕添加和刪除。 當按下添加時,會加載一個新表單,用戶可以輸入數據並保存到數據庫,刪除按鈕只是從數據庫中刪除人員。

謝謝

對這樣的 class 進行單元測試的一般思路是,就像任何其他 class 一樣:

  • 創建依賴項的 Mock 版本(Display、EventBus 等...)
  • 設定當 Presenter 工作時,depdencies 應該做什么的期望
  • 鍛煉 Presenter 並檢查期望值

但是,您的 Presenter 版本存在一些問題:

  • 未顯示 loadDbData() 方法,但我認為這意味着 Presenter 還可以訪問其他一些執行獲取的組件。 這個組件可以在依賴中抽象出來,並且像 rest 一樣被嘲笑嗎?

  • 然后是bind()的測試。 在此方法中,Presenter 的唯一職責是在 Display 提供的某些按鈕上設置回調。 您要測試的是:

    • 回調已設置
    • 設置回調做預期的事情

一些有助於后期的想法:

您可以減少 Presenter 和 Button 之間的耦合。 如果可能,將顯示界面從以下位置更改:

Button getAddButton();

addAddButtonClickedHandler(ClickHandler);

這意味着您的演示者不必使用返回實際按鈕的顯示 object

您可以將回調內容減少為調用單個方法,然后您可以單獨測試

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 class 的“虛擬”實現,它為您提供所有回調的列表,並讓您調用它們

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 的效果

這種類型的 class(主要將其他類粘合在一起)往往很難測試; 在某些時候,如果其他課程經過徹底測試,那么專注於膠水而不是膠水可能會適得其反。

希望這會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM