Подделка репозитория - метод подделки Find - PullRequest
1 голос
/ 04 ноября 2010

Для моего модульного тестирования мне нужно подделать репозиторий. Я легко смог подделать все методы, кроме метода Find, который принимает делегат Linq Expression в качестве параметра.

Мой поддельный код репозитория указан ниже (ненужный код удален). Код, который я пробовал использовать, показан в методе Find. Ошибка компилятора, которую я получаю от VS:

«System.Collections.Generic.List» не содержит определения «Где» и лучшей перегрузки метода расширения «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 ]

1 голос
/ 05 ноября 2010

Попробуйте изменить

 return courseList.Where<Course>(criteria); 

на

 return courseList.AsQueryable().Where<Course>(criteria).ToList(); 

Вы пытаетесь передать выражение, обычно используемое с IQueryables, в перегрузку Where, предназначенную для работы с IEnumerables ипринимает прямой делегат.Вы также возвращаете IQueryable, когда ваш метод четко говорит, что он возвращает IList.Нужен ли вам действительно IList, или вы можете получить конкретный список (который также IEnumerable и IQueryable и, таким образом, облегчает дальнейшие манипуляции) - это тема для другого обсуждения, но следует понимать, что ILists, как ILists, не может быть повторен;вам придется использовать или реализовать метод AsEnumerable (), чтобы преобразовать его в итеративный формат.

0 голосов
/ 05 ноября 2010

Я бы предложил использовать фальшивый фреймворк для репозиториев модульного тестирования.

...