2014-02-13 54 views
4

我正在嘗試使用我一直在研究的最近項目進行單元測試。將Moq C#代碼轉換爲等效的c#微軟單元測試的假貨

它涉及SQL Server 2008 R2數據庫和使用C#,.NET 4.5和Visual Studio 2013 Premium的WCF服務。我們使用實體框架(EF)6.0.1。

我想用Microsoft Fakes隔離測試WCF,以便它不需要數據庫。我們的目標是使用「內存數據庫」來做到這一點。我的困難是「爲EF」「dbcontext」dbcontext,所以我知道它處於可以被查詢,修改和監視的已知狀態。

我已經讀過,這可能是一個壞主意,因爲linq-to-objects和linq-to-sql之間的不同Linq提供程序。該功能可以在編譯時通過,但在運行時失敗。爲了解決這個問題,通過TFS部署到我們的DEV服務器後,我們也進行了集成測試(將WCF連接到真實的數據庫)。

我也讀過dbcontext可以使用MS FAKE進行掃描,但只是感覺不對。

此外,添加存儲庫模式(依賴注入(DI))不會導致我們的代碼覆蓋率增加,這是我們期望的結果之一。

然後我發現這篇文章http://msdn.microsoft.com/en-gb/data/dn314429.aspx和本文http://frankdecaire.blogspot.co.uk/2013/11/entity-framework-6-mocking-and-unit.html?showComment=1392224065716

這實現了我想做的事情,但使用起訂量。此代碼是否可以從Moq轉換爲MS FAKES? FAKES能夠完成Moq所做的一切嗎?還是我只需要學習Moq就可以增加我對FAKES的有限知識?

var mockSet = new Mock<DbSet<account>>(); 
mockSet.As<IQueryable<account>>().Setup(m => m.Provider) 
     .Returns(data.Provider); 
mockSet.As<IQueryable<account>>().Setup(m => m.Expression) 
     .Returns(data.Expression); 
mockSet.As<IQueryable<account>>().Setup(m => m.ElementType) 
     .Returns(data.ElementType); 
mockSet.As<IQueryable<account>>().Setup(m => m.GetEnumerator()) 
     .Returns(data.GetEnumerator()); 

任何問題隨時問

乾杯

凱爾

+0

如何在DI中使用存儲庫模式不會增加您的代碼覆蓋率?如果你想測試你的WCF服務而沒有任何額外的依賴關係,你應該使用DI來替換你的單元測試中的依賴關係,使用模擬或存根。 –

+0

@Wouter de Kort,在審查您的評論之後,我重構了我們的代碼,將業務邏輯移出資源庫類並返回到主WCF服務類。存儲庫類將通過EF6進行數據操作。我們的代碼覆蓋率將會增加。我是DI和儲存庫的新手,所以我認爲這樣做是錯誤的。我讀過的另一篇博客說,它很難單元測試錯誤代碼,除了缺乏知識之外,這裏肯定是這種情況!我仍然傾向於知道是否有人可以回答我的問題,如前所述:-) – Kyle

+0

聽起來不錯:)我寫了一篇關於重構代碼的文章,使它更易於測試:http://wouterdekort.blogspot.nl /2012/03/unit-testing-hell-or-heaven.html也許它可以幫助! –

回答

2

IMO,你需要開始邁向一個更加分層的方法移動解耦你的代碼。我不太清楚你需要通過單獨測試WCF來實現。 我建議具有三個層和它們的測試如下面 -

  1. 數據訪問 - 使用EF及其DB上下文並實現了一種數據訪問接口。您應該單元測試而不嘲笑EF的數據庫上下文。對這個層的測試將是「狀態」相關的。我的意思是,您的測試將與CRUD操作的真實數據和數據庫一起工作。測試運行後,您只需確保不會將更改保存到數據庫中。可以使用Spring.Net的測試庫來實現這一點,或者簡單地在事務範圍下運行測試,並在每次測試運行(清理)後回滾事務。

  2. 業務邏輯 - 包含業務邏輯並與數據訪問接口一起使用。使用像spring.net或ms unity這樣的任何DI框架來注入數據訪問層。您應該通過嘗試避免實際的數據庫調用來進行單元測試。這就是像NMock,Rhinomock或MOQ這樣的東西。使用mock設置邊界和異常條件,並確保您的業務邏輯解決所有問題。

  3. WCF服務層 - 適用於您的操作和數據合同。理想情況下,只轉發對業務邏輯的調用並轉換對數據合同的響應。我更喜歡在這個級別進行兩種類型的測試:a)測試翻譯和正確的呼叫轉移的單元測試。 b)使用代理的一些基本集成測試和一些沒有任何嘲弄地貫穿整個棧的測試數據。

我有MS假貨唯一的問題是,它附帶VS2012旗艦版,因此具有比像一個最小起訂量低得多的用戶羣。