2010-11-04 70 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