伪造存储库 - 伪造Find方法

时间:2010-11-04 20:46:11

标签: c# linq unit-testing repository-pattern

对于我的单元测试,我需要伪造一个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);
    }
}

2 个答案:

答案 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)

我建议使用模拟框架进行单元测试存储库。