对于我的单元测试,我需要伪造一个Repository。我很容易伪造除了以Linq表达式委托作为参数的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);
}
}
答案 0 :(得分:1)
尝试更改
return courseList.Where<Course>(criteria);
到
return courseList.AsQueryable().Where<Course>(criteria).ToList();
你试图将一个通常与IQueryables一起使用的表达式传递给设计用于IEnumerables并且采用直接委托的Where的重载。当你的方法清楚地说它给了一个IList时,你也会返回一个IQueryable。无论你是否真的需要一个IList,或者你是否可以使用一个具体的List(它也是IEnumerable和IQueryable,从而允许更容易的进一步操作)是另一个讨论的主题,但要理解作为IList的IList不能被迭代;您将不得不使用或实现AsEnumerable()方法将其转换为可迭代格式。
答案 1 :(得分:0)
我建议使用模拟框架进行单元测试存储库。