модульный тест для экспорта метода XML - PullRequest
1 голос
/ 15 февраля 2012

У меня есть метод ExportXMLFiles(string path) для экспорта XML-файлов по определенному пути с некоторыми элементами внутри него, такими как FirstName, LastName, MajorSubject. Эти значения выбираются из базы данных.

Теперь мне нужно написать метод юнит-теста для него, и я не работал над многими юнит-тестами, кроме простых и простых. Моя путаница заключается в том, нужно ли мне подключаться к базе данных и создавать файл XML, или мне нужно передавать жестко закодированные значения при создании файла XML, чтобы я мог проверить значения в созданном XML?

Есть ли другой способ сделать это?

Ответы [ 3 ]

2 голосов
/ 15 февраля 2012

Вы абсолютно не хотите использовать фактическую базу данных в своем модульном тесте. Это добавляет один уровень сложности, с которым вы не хотите иметь дело в своих юнит-тестах. Это также делает ваши юнит-тесты менее надежными и медленными. Посмотрите, сможете ли вы разбить функциональность базы данных на интерфейс, который вы можете создать с помощью фреймворка. Попробуйте посмотреть что-то вроде moq или, если этого недостаточно, посмотрите кротов от Microsoft.

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

0 голосов
/ 15 февраля 2012

Какова ответственность этого метода?Это дамп данных в виде файлов XML по определенному пути?Если да, то вам нужно проверить, действительно ли файлы созданы.

Это не модульный тест, а интеграционный тест (потому что это класс на границе между вашим приложением и файловой системой),Вы должны абстрагироваться от источника входных данных (БД) через интерфейс / роль.Вы также можете создать Role to CreateXmlFile (содержимое), но я думаю, что это излишне.

// setup mock data source to supply canned data
// call myObject.ExportToXml(mockDataSource, tempPath)
// verify files are created in tempPath

Наконец, этот класс должен реализовать Role (DataExporter), чтобы тесты, использующие DataExporter, были быстрыми / нетприходится иметь дело с файловыми системами (или XML).

0 голосов
/ 15 февраля 2012

Модульный тест должен быть небольшим по объему и изолированным от зависимостей, например, баз данных и файловых систем.Итак, что вы хотите сделать, это посмотреть на макетирование доступа к базе данных и что будет записано в файл, чтобы вы могли запустить свой тест, не требуя определенных значений в базе данных.Модульные тесты должны быть быстрыми, иметь повторяемые результаты (т.е. запускаться дважды, получать один и тот же ответ), быть изолированными от других тестов и иметь возможность запуска в любом порядке.

В модульном тесте рассматривается ОДИН элемент функциональности, и он не зависит от поведения чего-либо еще.

Итак, обратите внимание на использование шаблона, такого как внедрение зависимостей, чтобы вы могли обеспечить (т.е. внедрить) зависимости базы данных и файловой системы.Посмотрите на фальшивую инфраструктуру, такую ​​как NMock, или напишите собственные легкие поддельные объекты, которые реализуют тот же интерфейс, что и зависимости, и затем вы можете передать их в тестируемые функции.

...