2013-02-13 66 views
1

我試圖重構我的項目,以便我正在開發接口到最終 能夠創建模擬對象進行測試,我遇到了問題 實現/瞭解一些這些概念。我有一個IProducts接口,其中 由Products實現。但顯然我想能夠創建一個模擬產品對象。創建並提供模擬對象作爲參數

如何讓它取決於接口而不是實現?

public void AddNewProduct() 
     { 
      IDatabase db = new Database(); 
      IProducts products = new Products(); 
      products.addProductsToCache(); 
     } 

即如何指定此代碼以使用MockDatabase對象。

+0

編輯的問題+代碼 – Neeta 2013-02-13 15:26:05

回答

0

我的產品傳遞給方法:

public class YourProductContainerClass 
{ 
    private readonly IDatabase _database; 
    private readonly IProducts _products; 

    public YourProductContainerClass(
     IDatabase database, 
     IProducts products) 
    { 
     _database = database; 
     _products = products; 
    } 

    public void AddNewProduct(IProduct product) 
    { 
     products.Add(product); 
    } 
} 

只是我的2分錢就可以了。我從不創建interface只是「因爲我可能會在稍後的時間寫一個測試」。我編寫我的單元測試,因此我需要一個接口。

如果我不寫一個單元測試,那麼我也不會創建一個 接口。

爲什麼不呢?因爲很可能出現這種情況,單元測試的需求永遠不會因各種原因得到足夠的優先級。然後,您的代碼+接口更新的維護成本就會增加,但它並沒有真正增加您的設計(除了增加LoC的數量)。

因此,習慣於在函數之前編寫測試。如果由於某種原因你沒有看到單元測試的需要,還要考慮是否爲這個類編寫接口是有意義的。

PS:像Resharper之類的工具可以很容易地在稍後的時間點提取接口,並將遺留接口重構爲接口。這也是TDD的魅力,它帶走了很多痛苦。

0

假設你有一個庫存類,你想測試。庫存對IProducts有依賴性。所以它不應該關心它使用的Iproduct的實現。唯一重要的是它必須是IProducts的一個實例。在生產中,IProducts的實例將是產品的實例。在測試中,它將是模擬Iproducts的實例。

如果你介紹一個接口(IProducts),但庫存仍然取決於具體的Products類,那麼你的接口是沒用的。它應該僅取決於接口,而不取決於實現。

+0

我認爲這就是我的問題。我如何讓它取決於接口而不是實現? – Neeta 2013-02-13 15:03:49

+0

編輯問題 – Neeta 2013-02-13 15:26:36

+0

你的問題基本上歸結爲:什麼是依賴注入。請參閱http://code.google.com/p/google-guice/wiki/Motivation獲取解釋(以及Google,其中有大量鏈接)。你的類不應該創建其依賴項的實例。它應該通過setter方法的構造函數接收它們。 – 2013-02-13 15:35:03