Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 伪造存储库-伪造查找方法_C#_Linq_Unit Testing_Repository Pattern - Fatal编程技术网

C# 伪造存储库-伪造查找方法

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

对于我的单元测试,我需要伪造一个存储库。我很容易就能伪造所有的方法,除了Find方法,它将Linq表达式委托作为参数

下面列出了我的假存储库代码(删除了不必要的代码)。我尝试使用的代码显示在Find方法中。我从VS得到的编译器错误是:

“System.Collections.Generic.List”不包含“Where”的定义和最佳扩展方法重载“System.Linq.Queryable.Where(System.Linq.IQueryable,System.Linq.Expressions.Expression>)”有一些无效参数”

关于如何将criteria参数转换为所需的参数类型,有什么想法吗

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,这是一个非常有用的答案。我还将围绕一份具体清单研究你的建议。