2013-02-18 44 views
0

關於GWT testing的部分描述瞭如何驗證PresenterDisplay對象中的輸出,但並未解釋如何以相反的方式進行操作。換句話說,當用戶點擊Display中的按鈕時,我想檢查Presenter是否會向RPC Service發出正確的請求。如何模擬View/Display中的點擊事件以進行測試?

如何模擬Display中的按鈕點擊?發射GWT事件並不簡單,因爲它們具有受保護的構造函數。有沒有辦法簡單地做到這一點,而不需要子類ClickEvent類?

@Before 
protected void setUp() { 
    mockRpcService = mock(NegotiationServiceAsync.class); 
    eventBus = new HandlerManager(null); 
    mockDisplay = mock(NegotiationPresenter.Display.class); 
    negotiationPresenter = new NegotiationPresenter(mockRpcService, 
      eventBus, mockDisplay); 
} 

@Test 
private void testSth() {   
    when(mockDisplay.getSuppliersEmails()).thenReturn("[email protected]"); 
    when(mockDisplay.getTaskDescription()).thenReturn("This is the task to do"); 

    // This does not work 
    mockDisplay.getSubmitButton().fireEvent(new ClickEvent());  

    verify(mockRpcService).startTask(any(NegotiationRequest.class), any(AsyncCallback.class));  
} 

回答

1

當您使用MVP你平時測試方法演示注入嘲笑實現的觀點,所以在測試中顯示什麼也不做,只是提供存根方法來演示。另一方面,您的真實顯示實現應該將所有操作委託給演示者。

當用戶點擊提交按鈕調用演示的方法,這樣的事情來測試你的主持人的行爲方式:

@Test 
private void testSth() {   
    when(mockDisplay.getSuppliersEmails()).thenReturn("[email protected]"); 
    when(mockDisplay.getTaskDescription()).thenReturn("This is the task to do"); 

    negotiationPresenter.onSubmit(); 

    verify(mockRpcService).startTask(any(NegotiationRequest.class), 
            any(AsyncCallback.class));  
} 

一個非常不同的情況是,如果你想測試你的代碼使用GWTTestCase,以便你可以使用真正的視圖實現,但在這種情況下,你的測試會持續很長時間,失去使用MVP的主要目標之一,也就是解耦視圖以測試假設的主應用代碼可以在JVM中運行的Presenters和類中。

+0

+1您的答案可以解決問題。你能推薦一個教程來正確測試GWT應用程序嗎?谷歌的[教程](https://developers.google.com/web-toolkit/articles/mvp-architecture)在這裏頗具誤導性。首先,處理方法像'onSubmit()'在Presenter中是私有的,因此阻礙了測試。其次,Presenter知道屬於GWT包的'ClickEvent',而它應該接收'SubmitEvent'來讓Presenter測試。 – dzieciou 2013-02-24 06:32:15

+1

不要將事件傳遞給演示者。在視圖中你應該有這樣的東西:'submitButton(new ClickEvent()){presenter.submit()}'。在演示者中,您可以調用視圖來獲取值:'public submit(){view.getWhatever()...}'。因此,您可以看到視圖使用演示者在事件觸發時調用方法,並且演示者從視圖中獲取和設置值。測試方法的一種常見做法是使其受到保護,併爲測試類使用名稱空間。喲閱讀[this](https://developers.google.com/web-toolkit/articles/testing_methodologies_using_gwt)? – 2013-02-24 11:56:08