2013-08-21 226 views
0

互聯網充斥着頁面,說我們不應該爲私有方法編寫單元測試用例。但我不確定說我們應該完全忽略單元測試用例的私有方法是否正確?我知道如果我們測試主要的公共方法,他們最終會被測試。但想象一下,我的方法是通過私有方法訪問數據庫並從數據集中填充對象。如果我想爲我的數據庫使用模擬,我將不得不爲這種方法編寫一個單元測試用例,這會迫使我公開它。我如何克服這種情況?單元測試私有方法和使用模擬對象

由於下面是我的公開方法,如果我寫一個單元測試用例,它會每次都碰到數據庫。我想避免這種情況,因爲數據庫是我一直想要模擬的外部依賴項。使用數據庫的另一個問題是假設我正在對單元測試用例中的sysid進行硬編碼,直到系統數據庫存在於db中時才起作用。從db中刪除該記錄時,測試用例變得毫無用處。

public Order RetrieveOrderAndOrderItem() 
{ 
    DataSet ordersDS = new DataSet(); 
    Order obj = new Order(); 
    OrdersDb.RetrieveOrders(conKey,companySysId,userSysId,orderId,ordersDS); 
    obj = populateObjFromDb(ordersDS,orderItemId, orderItemSubType); 
    return obj; 
} 

private Order populateObjFromDb(DataSet orders,int orderItemId, int orderItemSubType) 
{ 
    Order orderObj = new Order(); 
    orderObj.OrderId = Converters.DBInt(orders.Tables[0].Rows[0]["OrderId"]); 
    return orderObj;   
} 
+0

嗯,首先要注意的是,不測試私有方法是好的,禮貌地說,hooey。你測試你需要測試的東西。我的一般方法是將需要測試的方法公開爲'protected',然後創建一個子類來訪問這些方法。 –

回答

4

測試私有方法在很大程度上取決於類的實現。你說對了,你通過公共的方法來測試一個班級是正確的。如果你有一個私人方法做了很多工作,你應該把它移到它自己的類中。

當您發現自己處於想要測試私有方法的情況時,應該開始考慮您的設計。

在你的例子中,爲什麼不讀取數據庫和填充你的對象一個單獨的類的代碼?單一責任原則規定,一個班級應該只有一個單一的責任。這個新類可以注入原始類,因此遵循依賴倒置原則。

像TDD和單元測試這樣的事情的目標是達成遵循SOLID原則的解決方案。

+0

請將您的代碼添加到問題中。這樣它不可讀。在處理外部依賴時,應該看看模擬和依賴注入。我寫了一篇關於它的文章,你可以在http://wouterdekort.blogspot.nl/2012/03/unit-testing-hell-or-heaven.html –

+0

找到你好Wouter添加了你的幫助表示讚賞的代碼。 –