Это последнее летнее время я разрабатывал базовое приложение ASP.NET/SQL Server CRUD, а модульное тестирование было одним из требований. Я столкнулся с некоторыми проблемами, когда пытался проверить базу данных. В моем понимании, юнит-тесты должны быть:Базы данных для тестирования модулей
- без гражданства
- независимо друг от друга
- повторяемые с теми же результатами, то есть не сохраняющиеся не изменяет
Эти требования, как представляется, противоречат друг другие при разработке для базы данных. Например, я не могу проверить Insert(), не убедившись, что строки, которые будут вставлены, еще не установлены, поэтому мне нужно сначала вызвать Delete(). Но что, если их еще нет? Тогда мне нужно будет сначала вызвать функцию Exists().
Мое возможное решение включало очень большие функции настройки (yuck!) И пустой тестовый сценарий, который запускался первым и указывал бы, что установка работает без проблем. Это жертвует независимостью тестов, сохраняя при этом их безгражданство.
Другое решение, которое я нашел, - это обернуть вызовы функций в транзакции, которую можно легко откат, например Roy Osherove's XtUnit. Эта работа, но она включает в себя другую библиотеку, другую зависимость, и кажется, что она слишком тяжела для решения проблемы.
Итак, что было сделано сообществом SO, столкнувшись с этой ситуацией?
tgmdbm сказал:
Вы обычно используете свой любимый автоматизированную основу модульного тестирования для выполнения тестов интеграции, которая почему некоторые люди путают, но они не следуют тем же правила. Вы позволили задействовать бетон внедрение многих ваших классов (потому что они были протестированы с помощью модуля). Вы тестируете , как ваши конкретные классы взаимодействуют друг с другом и с базой данных.
Так что, если я прочитал это правильно, нет действительно никакого способа эффективно блок-тесте доступа к данным слоя. Или же «единичный тест» уровня доступа к данным включает тестирование, скажем, SQL/команд, генерируемых классами, независимо от фактического взаимодействия с базой данных?