2011-08-18 33 views
1

我正在開發一個應用程序,並且希望在與項目過多之前提高我的測試覆蓋率。 到目前爲止,我在模型層上有相當好的測試覆蓋率,但控制器傾向於獲得很多邏輯(積累東西並從模型結果計算)。適用於單元測試的類的一般結構

有沒有人有關於如何構建我的應用程序的建議,以便所有部件都易於測試?當然,我可以重構控制器中的所有邏輯,只對每個控制器方法調用一個不同的類,然後只使用控制器中的渲染方法,但看起來有點激烈。

有沒有一種方法可以讓我看一下結果後一種方法,在控制器中運行,如

public static void controllerMethod(String a){ 
    String result = doSomething(); 
    String calcResult = calculateSomething(a); 
    render(result, calcResult) 
} 

我怎樣才能測試這種方法的預期成果和後calcResult就是我想要它在單元測試中?

該網站上的所有示例都是關於測試模型圖層的。我知道我可以對控制器運行功能測試,但對於我想測試的內容來說,這有點淺。

如果您對如何構建我的課程以獲得易於測試的應用程序有任何建議,請讓我知道。

+0

我不知道你是怎麼做到的......一個測試總是一個外部測試包裝了一個函數的調用。你不能在函數本身內測試部分結果。這不是調試:(我唯一看到的是使用經典的JUnit對每個函數進行單元測試,然後編寫一個函數來測試整個controllerMethod。 – mandubian

回答

1

控制器任務應該(主要)控制應用程序的流程(下一個顯示哪個頁面)。爲此,您可以在Play中使用selenium tests

如果您發現自己在控制器中添加了大量登錄名,請將其移動到相關模型中的方法(如果適用)或創建管理複雜部分的中間層(ala Services)。他們將比控制器更容易測試,並且可以讓您重用多個控制器上的邏輯(例如,通過REST API調用瀏覽器訪問)

+0

這實際上是我正在考慮的事情,也是我意思是將邏輯移出控制器,然後移入其他類(如服務層)。感謝您的回答 – Tommy

0

「我該如何測試在此方法之後預期結果和calcResult是我想讓它成爲一個單元測試?「 不要針對controllerMethod(Sting a)運行JUnit測試,而是針對doSomething()和calculateSomething(a)運行兩個JUnit測試。由於兩者都返回字符串,這是直截了當的。

編輯。還要考慮製作一個與「生產」代碼具有相同軟件包名稱的獨立測試項目,因爲它可以測試軟件包範圍的方法。

+0

問題在於這些方法可能是私有的,我不想將它們公開以便測試。 – Tommy

+0

使你的方法受到保護,然後你可以用JUnit訪問它們,只要它們具有相同的包名即可 也有一種方法可以在這種情況下測試私有方法。通過反射測試 – Farmor

+1

對不起,但我不喜歡爲了測試而改變能見度的方法如果事情很難測試你是​​你做出錯誤的事情。我想我會爲Pere Villega提出的建議,並將我可以進入的模型類,然後將其餘的邏輯移入服務層。然後我的控制器將變得很苗條,所有的代碼都會很容易測試。感謝您的回覆 – Tommy

相關問題