我正在嘗試使用我一直在研究的最近項目進行單元測試。將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());
任何問題隨時問
乾杯
凱爾
如何在DI中使用存儲庫模式不會增加您的代碼覆蓋率?如果你想測試你的WCF服務而沒有任何額外的依賴關係,你應該使用DI來替換你的單元測試中的依賴關係,使用模擬或存根。 –
@Wouter de Kort,在審查您的評論之後,我重構了我們的代碼,將業務邏輯移出資源庫類並返回到主WCF服務類。存儲庫類將通過EF6進行數據操作。我們的代碼覆蓋率將會增加。我是DI和儲存庫的新手,所以我認爲這樣做是錯誤的。我讀過的另一篇博客說,它很難單元測試錯誤代碼,除了缺乏知識之外,這裏肯定是這種情況!我仍然傾向於知道是否有人可以回答我的問題,如前所述:-) – Kyle
聽起來不錯:)我寫了一篇關於重構代碼的文章,使它更易於測試:http://wouterdekort.blogspot.nl /2012/03/unit-testing-hell-or-heaven.html也許它可以幫助! –