2014-12-05 38 views
3

指定某些設置,我試圖按照this獲取與起訂量開始試驗的例子。我能夠在我自己的測試項目中複製這些示例,並且可以讓我的測試通過(在我的上下文被注入的情況下測試我的服務)。不過,我不明白的是何時使用每個以下安裝呼叫:當在起訂量

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

有人能解釋非常基本的條款時,每一種應使用?

例如,看來如果在我的服務的方法,我是測試使用的表達,我需要做上述第二建立呼叫(我已經通過刪除並重新插入這些做了一些嘗試和錯誤調用)。我去過Moq文檔以及Table-TEntity的MSDN,但我仍然沒有看到它。也許是因爲我沒有很好地掌握Linq命名空間。

+0

你只需要指定你需要什麼....? – Swati 2014-12-05 17:06:47

+0

這就是我不確定的。我不確定每個人做什麼。我想獲得關於何時使用它們的基本解釋。合理? – 2014-12-05 17:32:17

回答

3

TL; DR - 當使用實體框架DBContext依賴,你需要在你打算嘲笑任何DBSet執行這些設置,特別是假數據返回到任何LINQ查詢的DBSet。所有4個設置應該爲每個模擬DbSet完成 - 這可以通過輔助方法進行。

的詳細信息:

一般來說,Strict mode off,安裝只需要對你真正需要模擬方法。在這種情況下,如果你還沒有一個方法Setup你是哪個單位的測試過程中調用,起訂量反而會爲此一直沒有明確Setup任何方法,通常是返回任何預期的default(T)提供默認行爲返回類型,T。對於類,缺省值爲null,這對於依賴於Mocked EF DbContext的類進行測試時不會有任何幫助。

您提供的具體的例子是標準的mocked setup for an Entity Framework DbSet,這然後允許你,通過從List<Blog>集合提供另IQueryable<Blog>(相對於通常的混凝土RDBMS實現),以提供用於該特定DbSet(DbSet<Blog>)假數據。

的建議將是對DbSet模擬代碼進入你的標準單元測試水暖安裝框架/工具包,以創建像一個輔助方法:

public static Mock<IDbSet<T>> GetMockedDbSet<T>(IList<T> fakeData) where T : class, new() 
{ 
    var data = fakeData.AsQueryable(); 

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

    return mockSet; 
} 

然後你可以設置你的模擬DBContext,如下:

var mockContext = new Mock<IMyDbContext>(); 
var mockBlogDbSet = GetMockedDbSet<Blog>(new List<Blog>{... fake data here ...}); 
mockContext.Setup(c => c.Blogs).Returns(mockBlogDbSet.Object); 

var sut = new SomeClassIWantToTest(mockContext.Object); // Inject dependency into Ctor 
sut.DoSomething();...