2013-02-14 4 views
3

Поверьте мне, я прочитал много статей и вопросов здесь, на SO. Но я не нашел удовлетворительного ответа. Возьмите Matt Robert's Tutorial в шаблоне хранилища и модульном тестировании в качестве примера:Тестирование запросов Linq EF и шаблон хранилища

Я не понимаю, что оба хранилища содержат ту же логику запросов? Кажется, это так, и если да, то как это полезная модель? Это будет означать, когда я изменяю запрос в поддельном репозитории, я должен изменить логику запросов в реальном репозитории - это звучит как PITA и рецепт проблем.

Я хотел бы оставить запрос в один метод и проверить этот метод. Позднее мне пришло в голову, я мог бы сделать так:

//Student can be from the db or a fake list 
public person GetStudent(IEnumerable<Student> students,int studentid) 
{ 
    return students.FirstOrDefault(s =>s.PersonId ==studentid); 
} 

//unit test 
    Assert.IsNull(GetStudent(fakeStudentList, -1)) 
//actual code 
    var student = GetStudent(entities.students,-1) 

Есть ли шаблон, который имитирует выше? Если так, то, что это? Или это как работает шаблон хранилища? Если да, то почему это похоже на то, что шаблон репозитория дублирует код?

А также, усилия .. смотреть на эту ужасающую example: S?

+1

Отличный вопрос и отличное имя пользователя (не могу дождаться книги 13!). +1 – Brian

+1

@Brian Книга уже отсутствует: P –

+1

Дух ... Я имел в виду книгу 14, и я вижу, что ** это уже уже! – Brian

ответ

2

Не так много, но я думаю, что у вас есть недостаток в вашем шаблоне репозитория.

Вы не должны проходить в студенческой коллекции до GetStudent(). GetStudent должен быть частью класса, который внутренне знает о списке студентов - будь то файл, List, база данных, что угодно.

Так что ваше «поддельное» хранилище может иметь ту же логику, или может просто возвращать жестко фиктивный Student. Если вы притворяетесь в репозитории, я предполагаю это, потому что вы тестируете что-то другое, которое нуждается в репозитории, поэтому ему не должно быть , как он получил Student.

Также в статье, на которой вы ссылаетесь, упоминается только один репозиторий, поэтому я не уверен, зачем вам его дублировать.

+0

Если 'GetStudent()' знает о '' Student''' или какой-то структуре данных, я думаю, что это плохой дизайн Не имеет значения, откуда находится список учеников - я должен был бы проверить запрос один раз. И о статье, это потому, что, к сожалению, я не могу найти примеры, где они реализуют оба репозитория , Но реализация репозиториев дает идею дублирования, но я все еще ищу. –

+0

Он должен знать о базовой коллекции. В этом-то и дело. Вы можете _initialize_ в репозитории каким-то образом, который дает ему базовые данные, но он знает об этом. Какой смысл иметь метод репозитория, где вы _hand_ это коллекция учеников и спросите его «дайте мне идентификатор с идентификатором x»? Почему бы просто не сделать это самостоятельно?Точка репозитория - это абстрагирование основной коллекции. –

+1

Как плохой дизайн для класса StudentRepository знать о базе данных/репозитории? В противном случае, в чем смысл класса StudentRepository? –

Смежные вопросы