2011-07-07 70 views
9

我有一個簡單的應用程序並希望使其可測試。我是這方面的新人。 這裏是一個簡單的Presenter,考慮到這個代碼,你可以建議或給我一些例子如何測試它。在MVP GWT應用程序中測試演示者

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

編輯:

是什麼演示是,從數據庫加載初始數據,有2個按鈕,添加和刪除。 當添加是按下然後一個新的形式加載和用戶可以輸入數據並保存到分區,刪除按鈕只是從數據庫刪除人。

感謝

回答

5

單元測試的總體思路這樣一類是像任何其他類:

  • 創建的依賴關係的模擬版本(顯示,EventBus等)
  • 就當演示工作
  • exercice演示的depdencies應該做哪些檢查期望
  • 集期望

但是有幾個問題與您的版本演示的:

  • 的loadDbData()方法沒有顯示,但我認爲這意味着演示者還可以訪問用來抓取其他一些組件。這個組件是否可以在依賴中被抽象出來,並且嘲笑喜歡其餘的?

  • 然後是bind()的測試。您的Presenter在此方法中唯一的責任是在顯示器提供的某些按鈕上設置回調。你要測試的是兩個:

    • 那回調設置
    • 那一套回調做預期的事

一些想法,以幫助後者:

您可以減少Presenter和Button之間的耦合。如果可能的話,改變在顯示界面上:

Button getAddButton(); 

addAddButtonClickedHandler(ClickHandler); 

這意味着你的演示沒有使用返回實際的按鈕

可以減少回調內容的顯示對象調用單一方法,即可以單獨測試

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()); 
     } 
    } 
    // .... 
} 

那麼你的測試將:

  • 創建演示這樣的啞顯示
  • 使用綁定設置回調
  • 使用display.fireAddButtonClick()來模擬用戶點擊
  • 檢查是否有點擊的結果,fireAdded的效果可見

這種類型的類(主要是將其他類粘在一起)往往很難測試;在某種程度上,其他類別的產品都經過了徹底的測試,它可以將注意力集中在膠水機上,而不是粘在膠水上。

希望這有助於。

+0

謝謝!它有助於。 :) – adgfs

+0

如果它具有受保護的構造函數,那麼'ClickEvent'如何實例化? – dzieciou

+0

這僅僅是一個例子,我不知道確切的ClickHandler類(我認爲它只是一個接口)。 – phtrivier