2016-05-19 166 views
1

我有一個程序集有一個公共方法。我想爲這種方法寫一個單元測試。 要創建此類的實例,將調用默認的構造函數。我無法改變這一點。 所有此方法都會檢查傳入該方法的對象,並根據值更新數據庫中的表。 對於單元測試,我想驗證數據庫調用已經完成。 我想嘲笑數據庫。這樣做的最好方法是什麼? 到目前爲止,我已經添加了一個IRepository類型的屬性。 在該方法中,如果這是空的,我創建一個Repository實例。我的想法是,在單元測試中,我將把這個屬性設置爲Mocked Repository。這聽起來不錯嗎?單元測試和嘲笑分號

public IRepository DatabaseInstance { get; set; } 

public void Process(ObjectContext context) 
{ 
    if (DatabaseInstance == null) 
     DatabaseInstance = new UpdateRepository(); 
    // Depending on value in context, set up values of sprocToCall and listOfParameters 

    //Eventually call UpdateTable 
    DatabaseInstance.UpdateTable(sprocToCall, listOfParameters); 
} 
+0

測試數據庫是一個集成測試,而不是單元測試。但是,如果你嘲笑數據庫,那麼你一點都沒有測試,這是毫無意義的。除非你在Process()中有業務邏輯,否則我不打擾。 – Crowcoder

+0

有一些商業邏輯..在取決於對象的上下文的值不同的表在數據庫中更新。 – Fiona

+1

您聲明您的目標是驗證數據庫調用是否已完成,但您將如何通過模擬來做到這一點?如果您正在測試獨立於數據訪問的業務邏輯,那麼模擬數據是絕對合適的。你可能需要設置依賴注入(用於交換界面),或者你需要將你的數據訪問分割成一個新的虛擬方法,可以用[Moq](https://github.com/Moq)/moq4 /維基/快速開始)。 – Crowcoder

回答

1

看起來你是幾乎沒有了。你只需要你這樣的模擬課程;

public interface IRepository 
{ 
    void UpdateTable(string sprocToCall, List<string> listOfParameters); 
} 

public class MockRepository:IRepository 
{ 
    public string SprocToCall { get; set; } 
    public List<string> ListOfParameters { get; set; } 
    public void UpdateTable(string sprocToCall, List<string> listOfParameters) 
    { 
     SprocToCall = sprocToCall; 
     ListOfParameters = listOfParameters; 
    } 
} 

我已經包含了我使用的接口,因爲它可能與您的IRepository版本不同。

您可以將您的IRepository屬性設置爲上述模擬類的版本,而不是傳入實際的實現。然後,您可以查看模擬類,以確定您的類是否正確調用了UpdateTable。這聽起來就是你正在計劃做的事,以便回答你的問題;是的 - 聽起來不錯。

使用自己的模擬類(他們開始構建一段時間後)的替代方法是使用NSubstitute或Moq等模擬框架,它更像是一個學習曲線,但是從長遠來看更快。

+0

謝謝Mark_h。我用Moq來嘲笑這個版本。只是想知道我在正確的軌道上。再次感謝 – Fiona