Сведения о вопросе

Getthesound

03:56, 25th August, 2020

Теги

c#   unit-testing   tdd   mocking    

Как я должен протестировать метод, который заполняет список из DataReader?

Просмотров: 472   Ответов: 6

Поэтому я работаю над некоторым устаревшим кодом, который тяжело переносится на ручные операции с базой данных. Я стараюсь поддерживать здесь некое подобие качества,поэтому стараюсь делать все возможное.

Код, над которым я работаю, должен быть заполнен, скажем, a List<Foo> из A DataReader, который возвращает все поля, необходимые для функционирования Foo. Однако если я хочу проверить, что код фактически возвращает один элемент списка на одну строку базы данных, я пишу тестовый код, который выглядит примерно так:

Expect.Call(reader.Read()).Return(true);
Expect.Call(reader["foo_id"]).Return((long) 1);
// ....
Expect.Call(reader.Read()).Return(true);
Expect.Call(reader["foo_id"]).Return((long) 2);
// ....
Expect.Call(reader.Read()).Return(false);

Что тоже довольно утомительно и довольно легко нарушается.

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

Кстати, в настоящее время я использую Rhino.Mocks для этого, но я могу изменить его, если результат будет достаточно убедительным. Просто пока альтернативой не является TypeMock, потому что их EULA было немного слишком страшно на мой вкус, когда я последний раз проверял.

Edit: я также в настоящее время ограничен C# 2.



  Сведения об ответе

VCe znayu

22:37, 7th August, 2020

Чтобы сделать это менее утомительным, вам нужно будет инкапсулировать/рефакторировать сопоставление между DataReader и объектом, который вы держите в списке. Существует довольно много шагов, чтобы инкапсулировать эту логику. Если это та дорога, по которой вы хотите ехать, я могу отправить вам почтовый индекс. Я просто не уверен, насколько практично было бы разместить код здесь, на StackOverflow, но я могу дать ему шанс сохранить его кратким и по существу. В противном случае вы застряли с утомительной задачей повторения каждого ожидания на индексном методе доступа для читателя. Процесс инкапсуляции также избавит вас от строк и сделает их более многоразовыми с помощью ваших тестов.

Кроме того, я не уверен на данный момент, насколько вы хотите сделать существующий код более тестируемым. Поскольку это устаревший код, который не был построен с учетом тестирования.


  Сведения об ответе

pumpa

05:53, 20th August, 2020

Я думал о публикации какой-то код и тут я вспомнил, о чем ДЖП Будху, но .NET курс. У него есть образец проекта , которым он делится и который был создан во время одного из его занятий. Проект размещен на Google Code , и это хороший ресурс. Я уверен, что у него есть несколько хороших советов для вас, чтобы использовать и дать вам идеи о том, как рефакторировать отображение. Весь проект был построен с помощью TDD.


  Сведения об ответе

SILA

08:13, 15th August, 2020

Вы можете поместить экземпляры Foo в список и сравнить объекты с тем, что Вы читаете:

var arrFoos = new Foos[]{...}; // what you expect
var expectedFoos = new List<Foo>(arrFoos); // make a list from the hardcoded array of expected Foos
var readerResult = ReadEntireList(reader); // read everything from reader and put in List<Foo>
Expect.ContainSameFoos(expectedFoos, readerResult); // compare the two lists


  Сведения об ответе

ITSME

01:22, 26th August, 2020

Коко,

Тут есть пара неправильных вещей. Во-первых, делая это таким образом, я должен сначала сконструировать Foo, а затем передать их значения в mock reader, который ничего не делает для уменьшения объема кода, который я пишу. Во-вторых, если значения проходят через считыватель, то Foos не будет тем же самым Foos (ссылочное равенство). Они могут быть равны, но даже это предполагает слишком много из класса Foo, к которому я не осмеливаюсь прикоснуться в данный момент.


  Сведения об ответе

lourence

22:46, 22nd August, 2020

Просто чтобы уточнить, вы хотите иметь возможность проверить ваш вызов в SQL сервер вернул некоторые данные, или что если бы у вас были какие-то данные, вы могли бы сопоставить их обратно в модель?

Если вы хотите проверить свой вызов в SQL вернул некоторые данные проверить мой ответ можно здесь


  Сведения об ответе

fo_I_K

21:47, 12th August, 2020

@Toran: то, что я тестирую,-это программное сопоставление данных, возвращенных из базы данных, с моделью домена quote-unquote. Поэтому я хочу смоделировать подключение к базе данных. Для другого вида теста я бы пошел на тотальное интеграционное тестирование.

28 я думаю, что вы довольно хорошо справились с этим, и я боялся, что это может быть так. Если у вас есть указатели на какие-либо статьи или что-то подобное, где кто-то сделал грязную работу и разложил ее на более легко усваиваемые шаги, я буду признателен. Образцы кода тоже не помешают. У меня есть ключ к тому, как подойти к этой проблеме, но прежде чем я действительно осмелюсь сделать это, мне нужно будет сделать другие вещи, и если тестирование этого потребует утомительного издевательства, то именно это я и сделаю.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться