伪造存储库 - 伪造查找方法
对于我的单元测试,我需要伪造一个存储库。我很容易就能伪造除了将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);
}
}
尝试改变
return courseList.Where<Course>(criteria);
到
return courseList.AsQueryable().Where<Course>(criteria).ToList();
你试图传递一个表达式,通常与IQueryables使用,成为凡设计过载与IEnumerables和工作需要一个直接的代表。当你的方法清楚地说明它返回一个IList时,你也返回一个IQueryable。无论你是否真的需要一个IList,或者如果你可以用一个具体的List(它也是IEnumerable和IQueryable,因此允许更容易的进一步操作)脱身是另一个讨论的话题,但是要理解ILists作为ILists不能被迭代;您必须使用或实现一个AsEnumerable()方法将其转换为可迭代格式。
我会建议使用单元测试存储库的模拟框架。
通常这是一个好主意,但是像这样的简单定义的模拟也有价值,尤其是对于模拟数据存储。模拟期望的管理可能非常棘手(你必须期望得到你想要的,不多不少),而评估像这样的内存模拟对象的有效性要简单得多。 – KeithS 2010-11-04 22:11:50
感谢KeithS,这是一个非常有用的答案。我还会围绕一个具体的列表来研究你的建议。 – Ozzy 2010-11-05 09:14:25