2012-12-06 89 views
1

我正在C#中爲兩個項目構建一個類庫。這個類庫與SQLServer數據庫有很多連接。模擬靜態C#數據庫類

,因爲這個庫只是從SQLServer數據庫,以便有一個靜態類是負責的負載連接設置並打開它檢索數據。然後庫的類接收所需的數據來執行查詢並返回結果。所有這些都是使用靜態方法完成的。

就是這樣。

internal static class DBConnection 
{ 
    private const String connectionString = "some connection string"; 
    public static SqlConnection open() { /* ... open the connection ... */ } 
} 

public static class DataXRetriever 
{ 
    public static List<DataX> RetrieveById(Int32[] ids) 
    { 
     using (SqlConnection connection = DBConnection.open()) 
     { 
      /* ... do a query ... */ 
      /* ... do something with the result of the query ... */ 
      /* ... return it ... */ 
     } 
    } 

    /* ... some other static methods ... */ 
} 

我想要做一個測試單元,這些樣的方法,而不需要被連接到數據庫中,我一直在閱讀,這是可以做到實例包含連接類,並給它將使用它的類,但是我的設計不能像那樣工作。

+5

這就是爲什麼你不應該使用靜態類或單例。 – SLaks

+0

添加到StriplingWarrior的答案,看看Ninject(依賴注入)。你明確地根據接口進行編程。 http://www.ninject.org – Fredrik

回答

1

您可能允許代碼修改連接字符串,而不是使其成爲靜態的,然後讓你的單元測試設置代碼在運行測試之前改變它的值。 (更新:關於第二個想法,對於具體的事情你正在試圖做的,即使這樣,也沒有真正的工作

但要做到這一點正確方式是針對接口編程是那些獲得注入進入你的班級,這樣他們可以很容易地在個案的基礎上嘲笑。

換句話說,如果你的設計「不喜歡那個工作」,那麼你的設計是錯誤的,它需要改變。

+0

恩,謝謝。也許這可以幫助我說服改變項目的設計。 – Vraiment

+0

@StriplingWarrior:請你舉例說明這個概念嗎? –

+0

@JesonMartajaya:我現在沒有時間寫一個例子,但我建議閱讀[this]這樣的文章(http://www.programmersranch.com/2013/09/c-mocking- and-dependency-injection-for.html)來獲得一般想法。 – StriplingWarrior