2014-03-24 68 views
2

我有一個從表返回的記錄列表中的泛型方法:單元測試泛型方法與最小起訂量

public List<T> GetValidRecords<T>() where T: class, IGetListOfTables 
{ 
    try 
    { 
     return _context.Set<T>().Where(x => x.Valid == 1).ToList(); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

,我有此方法的單元測試:

[TestMethod] 
public void GetValidRecords() 
{ 
    var data = new List<tableName> 
    { 
     new tableName() {Valid= 1}, 
     new tableName() {Valid= 1} 
    }.AsQueryable(); 

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

    var mockContext = new Mock<ALMONEntitiesNew>(); 
    mockContext.Setup(x => x.tableName).Returns(mockSet.Object); 
    var database = new Database(mockContext.Object); 
    var numberOfRecords = database.GetValidRecords<tableName>(); 
    Assert.AreEqual(2, numberOfRecords.Count, "Wrong number of valid records."); 
} 

的問題是,我從表中獲得實際的記錄數,而不是數量。 我該如何解決它?

+0

你沒有'Setup'爲'設置<>'方法 –

+0

@JordyLangen你能提供樣品嗎? – Sasha

回答

1

您需要從GetValidRecords方法中獲取EF實現的所有依賴項,特別是_context,否則EF特定實現將不斷流入您的單元測試。爲了將GetValidRecords作爲一個單元來測試,你需要使它能夠獨立運行。如果你想按照原樣進行測試,我建議使用集成測試,它實際上是從數據庫中檢索記錄並斷言它們恢復正常 - 這不需要使用任何模擬框架,並且是一種非常好的測試方法這個功能。

在作出GetValidRecords的話題獨立,我看到DbSet實現IEnumerable,所以也許你想要的是這樣的:

public static List<T> GetValidRecords<T>(this IEnumerable<T> source) where T: class, IGetListOfTables 
{ 
    if (null == source) 
    { 
     throw new ArgumentNullException("source"); 
    } 

    return source.Where(x => x.Valid == 1).ToList(); 
} 
+0

好的答案,但在您的示例代碼中,try/catch吞噬了原始異常的堆棧跟蹤,應該刪除。 –

+0

@MikeStockdale是的,我知道 - 只是想保持話題。感謝您注意到,我認爲解決這個問題最好。會做。 –