2010-11-04 67 views
1

對於我的單元測試,我需要僞造一個存儲庫。我很容易就能僞造除了將Linq Expression委託作爲參數的Find方法以外的所有方法。僞造存儲庫 - 僞造查找方法

我的假存儲庫代碼列在下面(不必要的代碼已刪除)。我嘗試使用的代碼顯示在Find方法中。我從VS獲得的編譯器錯誤是:

「System.Collections.Generic.List」不包含'Where'和最佳擴展方法重載定義'System.Linq.Queryable.Where(System.Linq .IQueryable,System.Linq.Expressions.Expression>)」有一些無效參數」

如何我彎曲標準參數進入參數類型所需的任何想法?

public class FakeCourseRepository : IRepository<Course> 
{ 
    private List<Course> courseList; 

    public FakeCourseRepository(List<Course> courses) 
    { 
     courseList = courses; 
    } 

    public IList<Course> Find(System.Linq.Expressions.Expression<Func<Course, bool>> criteria) 
    { 
     return courseList.Where<Course>(criteria); 
    } 
} 

回答

1

嘗試改變

return courseList.Where<Course>(criteria); 

return courseList.AsQueryable().Where<Course>(criteria).ToList(); 

你試圖傳遞一個表達式,通常與IQueryables使用,成爲凡設計過載與IEnumerables和工作需要一個直接的代表。當你的方法清楚地說明它返回一個IList時,你也返回一個IQueryable。無論你是否真的需要一個IList,或者如果你可以用一個具體的List(它也是IEnumerable和IQueryable,因此允許更容易的進一步操作)脫身是另一個討論的話題,但是要理解ILists作爲ILists不能被迭代;您必須使用或實現一個AsEnumerable()方法將其轉換爲可迭代格式。

+0

感謝KeithS,這是一個非常有用的答案。我還會圍繞一個具體的列表來研究你的建議。 – Ozzy 2010-11-05 09:14:25

0

我會建議使用單元測試存儲庫的模擬框架。

+0

通常這是一個好主意,但是像這樣的簡單定義的模擬也有價值,尤其是對於模擬數據存儲。模擬期望的管理可能非常棘手(你必須期望得到你想要的,不多不少),而評估像這樣的內存模擬對象的有效性要簡單得多。 – KeithS 2010-11-04 22:11:50