2015-10-14 35 views
2

好吧假設我有一個控制我的數據層的類和一個執行工作的類。與數據庫通信的單元測試類

class MyData 
{ 
    public DataTable GetMyData() 
    { 
     return Query.MyDataBase.ResultDT(); 
    } 
} 

class MyWork 
{ 
    public int DoWork() 
    { 
     MyData Data = new MyData(); 
     DataTable DT = Data.GetMyData(); 
     return DT.Rows.Count; 
    } 
} 

我怎樣才能測試我的DoWork方法與單元測試沒有訪問數據庫。

回答

5

充分利用MyData類的依賴參數和施工的MyWork類中注入它。爲了進行單元測試,可以在單元測試中模擬依賴關係,以確保它以預期的方式調用已定義的依賴項的合同。

通常,這意味着:

  • 定義的界面處的依賴性即IMyData
  • 構造簽名應該期望接口類型,而不是具體的類型。

作爲最終結果,如下您的代碼將被轉換:

interface IMyData 
{ 
    DataTable GetMyData(); 
} 

class MyData : IMyData 
{ 
    public DataTable GetMyData() 
    { 
     return Query.MyDataBase.ResultDT(); 
    } 
} 

class MyWork 
{ 
    private IMyData _myData; 

    public MyWork(IMyData myData) 
    { 
     _myData = myData; 
    } 

    public int DoWork() 
    { 
     DataTable DT = _myData.GetMyData(); 
     return DT.Rows.Count; 
    } 
} 

作爲一步,你應該檢查出的設計原則,因爲這類型的設計說明了爲什麼它們的存在。

更多關於Wikipedia: SOLID (OO design)

編輯:

你的單元測試,然後會看起來像(假設你正在使用的起訂量嘲諷框架):

[TestMethod()] 
public void TestMyWork() 
{ 
    var mockMyData = Mock<IMyData>(); 
    mockMyData.Setup(x => x.GetMyData()).Returns(new DataTable()); 

    MyWork work = new MyWork(mockMyData); 
    int result = work.DoWork(); 
    Assert.AreEqual(1, result); 
} 

..但在真正的世界,你會更可能實例化MyWork與真實的MyData實例如下(除非你使用依賴注入框架,如MEF或團結):

var myWork = new MyWork(new MyData()); 
1

首先,按照@toadflakz建議,並注入到MyDataMyWork的構造。

然後,使用一些ORM將數據從數據庫映射到對象。請勿使用DataTable

爲了DoWork更容易測試,考慮重構爲pure function

public int DoWork(DataTable dt) 
{ 
    // make some complex calculations on dt 
} 

這樣的DoWork結果只取決於輸入參數,這使得它很容易測試。