Как написать тестовый метод в NUnit для тестирования метода savefile? - PullRequest
4 голосов
/ 17 октября 2008

Я написал метод savefile для сохранения объекта в xml. Но я не уверен, как проверить метод в NUnit. Нужно ли создавать образец файла вручную и сравнивать строку между файлами? Есть ли лучшие способы проверить метод?

Спасибо за ваш ответ.

Ответы [ 5 ]

1 голос
/ 17 октября 2008

Опции

  1. Упрощенно: используйте подход «Золотой файл». Создайте ожидаемый выходной файл только для чтения в качестве ресурса. Выполните байтовое / строковое сравнение с фактическим сгенерированным файлом.
  2. Я слышал, что некоторые люди используют XmlUnit для этой цели. Никогда не использовал его лично, но, возможно, стоит взглянуть на
1 голос
/ 17 октября 2008

Тьфу, проверка вывода XML. Добро пожаловать в ад :)

Метод, который работал для меня, заключался в создании объекта XmlDocument в памяти. Затем запустите ваш метод SaveFile и загрузите его в другой XmlDocument. Обходите оба XmlDocuments рекурсивно, сравнивая все элементы и атрибуты.

К сожалению, написание xml с объектами C # является большим и громоздким. Я бы рекомендовал тестировать подразделы одновременно. Возможно, в вашем файле сохранения есть субэлемент <FileList>, субэлемент <Cups> и субэлемент <Rifles>. В этом случае напишите серию тестов, чтобы убедиться, что каждый подраздел выполнен правильно, а не общий вывод.

1 голос
/ 17 октября 2008

Было бы проще, если бы вы показали код. Мой способ обойти это, добавить слой абстракции. Не используйте метод Save напрямую с XmlWriter. Вместо этого создайте оболочки, каждый из которых сможет сохранить небольшой логический фрагмент ваших данных в xml и протестировать их.

для каждого Wrapper есть метод, подобный

void Persist(XmlWriter writer);

и пусть Save просто соберет данные из обёрток. Другими словами, Wrappers будет нести ответственность за правильное сохранение данных, но каждый будет нести ответственность только за небольшую их часть. Там вы можете проверить это, сравнив строки (поместите StringWriter в XmlWriter, который вы передаете в метод Persist)

0 голосов
/ 17 октября 2008

Создайте свой класс так, чтобы у вас были SaveFile (строка fileName) и SaveFile (писатель XmlWriter). SaveFile (строковое имя файла) нужно только создать XmlWriter для именованного файла и вызвать SaveFile (writer). Проведите обширное модульное тестирование по методу SaveFile (XmlWriter Writer), для которого вы можете использовать фиктивный XmlWriter. Протестируйте некоторые условия ошибки - если вы ожидаете обработать их, а не распространять их вверх - с помощью метода SaveFile (string filename). В зависимости от обработки ошибок, вам вообще может не понадобиться создавать файл.

Кстати, вам не нужно выставлять свой метод напрямую, используя XmlWriter, если вы этого не хотите. Вы можете сделать его приватным и использовать аксессор для его вызова в своих тестах.

0 голосов
/ 17 октября 2008

Вот что я делаю - это работает для меня, но может не соответствовать вашим требованиям.

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

В тестовом методе я удаляю файл, если он существует (не должен, так как разбор уже позаботился о нем), затем выводит файл в XML, а затем утверждает, что файл существует. Затем я перезагружаю файл либо в граф объектов, либо в XML-модель DOM и запрашиваю состояние через столько утверждений, сколько вам нужно.

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

...