C# 伪造存储库-伪造查找方法
对于我的单元测试,我需要伪造一个存储库。我很容易就能伪造所有的方法,除了Find方法,它将Linq表达式委托作为参数 下面列出了我的假存储库代码(删除了不必要的代码)。我尝试使用的代码显示在Find方法中。我从VS得到的编译器错误是: “System.Collections.Generic.List”不包含“Where”的定义和最佳扩展方法重载“System.Linq.Queryable.Where(System.Linq.IQueryable,System.Linq.Expressions.Expression>)”有一些无效参数” 关于如何将criteria参数转换为所需的参数类型,有什么想法吗C# 伪造存储库-伪造查找方法,c#,linq,unit-testing,repository-pattern,C#,Linq,Unit Testing,Repository Pattern,对于我的单元测试,我需要伪造一个存储库。我很容易就能伪造所有的方法,除了Find方法,它将Linq表达式委托作为参数 下面列出了我的假存储库代码(删除了不必要的代码)。我尝试使用的代码显示在Find方法中。我从VS得到的编译器错误是: “System.Collections.Generic.List”不包含“Where”的定义和最佳扩展方法重载“System.Linq.Queryable.Where(System.Linq.IQueryable,System.Linq.Expressions.E
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);
}
}
公共类FakeCourseRepository:IRepository
{
私人名单课程专家;
公共伪造课程(列出课程)
{
课程列表=课程;
}
公共IList查找(System.Linq.Expressions.Expression条件)
{
返回课程列表。其中(标准);
}
}
尝试更改
return courseList.Where<Course>(criteria);
返回课程列表,其中(标准);
到
return courseList.AsQueryable().Where(criteria.ToList();
您正试图将一个表达式(通常与IQueryables一起使用)传递到一个重载Where中,该重载设计用于处理IEnumerables,并接受一个直接委托。当您的方法清楚地表明它返回了一个IList时,您也返回了一个IQueryable。你是否真的需要一个IList,或者你是否可以得到一个具体的列表(它也是IEnumerable和IQueryable的,因此允许更容易的进一步操作),这是另一个讨论的主题,但是要理解IList,作为IList,不能被迭代;您必须使用或实现AsEnumerable()方法将其转换为iterable格式。尝试更改
return courseList.Where<Course>(criteria);
返回课程列表,其中(标准);
到
return courseList.AsQueryable().Where(criteria.ToList();
您正试图将一个表达式(通常与IQueryables一起使用)传递到一个重载Where中,该重载设计用于处理IEnumerables,并接受一个直接委托。当您的方法清楚地表明它返回了一个IList时,您也返回了一个IQueryable。你是否真的需要一个IList,或者你是否可以得到一个具体的列表(它也是IEnumerable和IQueryable的,因此允许更容易的进一步操作),这是另一个讨论的主题,但是要理解IList,作为IList,不能被迭代;您必须使用或实现一个AsEnumerable()方法将其转换为一种可编辑的格式。我建议对单元测试存储库使用模拟框架。我建议对单元测试存储库使用模拟框架。通常这是一个好主意,但像这样简单定义的模拟也有价值,特别是模拟数据存储。模拟期望可能很难管理(您必须准确地期望您想要的,不多也不少),而像这样评估给定给内存中模拟的对象的有效性要简单得多。通常这是一个好主意,但像这样简单定义的模拟也有价值,特别是对于模拟数据存储。模拟期望可能很难管理(你必须准确地期望你想要的,不多也不少),而像这样评估给定给内存中模拟的对象的有效性要简单得多。谢谢KeithS,这是一个非常有用的答案。我还将围绕一个具体的清单来研究你的建议。谢谢KeithS,这是一个非常有用的答案。我还将围绕一份具体清单研究你的建议。