2011-12-16 97 views
3

我想測試視圖層嘲笑控制器的測試視圖層的方法

我有方法

class Controller ... { 
public void do() { 

    List<String> data = .... 

    render(data); 
} 
.. 
} 

一個控制器I具有web的驅動器測試(功能測試),該測試能夠數據要顯示爲頁面上的列表。

那麼,我怎樣才能嘲笑PlayFramework的控制器中的do()方法,以便不依賴於從某處獲取的真實數據?什麼是常用方法?如果遊戲在某些特定的測試中被嘲笑,將如何知道/使用該控制器的方法。

- 已經得到了一些意見(THX)後增加:

我只是想測試一個視圖時,控制器會返回一些數據返回給它。

但我的控制器的邏輯還沒有準備好,我只知道它會返回列表< String>,並且在視圖中,我需要顯示這個字符串在< li> html元素中。而已。

我什麼都不知道 - 我將如何實現我的控制器,它將使用數據庫或Web服務將數據返回到視圖(爲什麼我不能在我的控制器中模擬任何東西..讓我們說Http.get( )..或Database.get())..

  • 我還不知道我將如何實現我的控制,我現在該怎麼辦,它將返回 - 然而,對於視圖不要緊控制器如何完成其工作 - 視圖只顯示這些數據,我想測試它 - 是否能夠顯示任何數據,如html中的列表。

回答

1

我對PlayFramework一無所知,但這是單元測試MVC時出現的一個常見問題。一般來說,你有你的'功能'或集成測試,測試整個事情是否有效,併爲你的模型進行單元測試。除了需要100%的代碼覆蓋率之外,您還需要問自己,您是否確實需要測試此代碼。

如果您決定這樣做,那麼我會着重於重構您的函數,以使用依賴注入將模擬對象注入要測試的函數中。但是,如果您必須對單元測試代碼進行重構,那麼您的集成測試將涵蓋這些代碼,那麼它真的需要嗎?

+0

我在我的描述中添加了一些解釋。 (無論如何,Thx的回覆) – ses 2011-12-16 20:58:55

0

如果你想測試你的視圖層,使用Selenium。 它由Play提供。

此外,您可以使用特殊的數據庫版本進行測試。

不要試圖模擬控制器:使用內存數據庫(非常快)並在其中加載數據用於測試。

添加您的更新後:

也許直到你開發控制器,你可以硬編碼的列表。

3

構建一個接口以使用獲取數據的方法。

public interface DataProvider { 
    public List<String> getData(); 
} 

對於測試,您可以使用提供某些測試值的類來實現此接口。

public class MockDataProvider implements DataProvider { 
    public List<String> getData() { 
     String[] testData = {"a","b","c"}; 
     return Arrays.asList(testData); 
    } 
} 

後來,當你知道從那裏您將獲取數據(數據庫,Web請求,不管)你只是再次實現你的接口。

public class WebProvider implements DataProvider { 
    public List<String> getData() { 
     ... WS.url("http://service.example.com").get(); 
     // fetch the data 
     return dataList; 
    } 
} 

而在你的控制器中,你可以切換你是否處於測試模式。

class MyController ... { 
    public static void datalist() { 
     DataProvider provider; 

     if (Play.runingInTestMode()) { 
      provider = new MockDataProvider(); 
     } else { 
      provider = new WebProvider(); 
     } 

     List<String> data = provider.getData(); 
     render(data); 
    } 
}