Мне любопытно, какие стратегии люди нашли для модульного тестирования класса доступа к данным, который не включает загрузку (и, вероятно, выгрузку) реальной базы данных для каждого метода тестирования? Используете ли вы фиктивные объекты для представления соединения с базой данных? Если да, то требуется ли передавать фиктивный объект в каждый тестируемый метод и, таким образом, заставлять API требовать реального соединения с БД в качестве параметра для каждого метода? Или вы передаете фиктивный объект в конструктор при setup ()?
У меня есть класс, который реализует шаблон Data Mapper (или, может быть, шлюз). Это класс, отвечающий за инкапсуляцию SQL и возврат (или сохранение) «бизнес-объектов». Остальная часть кода может взаимодействовать с этим уровнем отображения и бизнес-объектами, полностью игнорируя модель постоянства. Этот код должен иметь / поддерживать или просто знать о действующем соединении БД в реальной системе. Подражать этому тесту сложно.
Проблема в том, как выполнить модульное тестирование одного из этих классов картографа. Практика создания модульного теста в xUnit, которую я видел чаще всего, заключается в использовании метода теста setup () для создания экземпляра SUT (тестируемой системы), обычно вашего тестируемого объекта, и сохранения его в локальной системе. переменная в тестовом классе. Затем каждый из ваших методов тестирования взаимодействует с уникальным экземпляром этого SUT.
Предполагается, что все, что вы делаете в методе setup (), предположительно будет реплицировано где-то в вашем реальном коде. Таким образом, вы должны думать о процессе установки как «это то, что я захочу многократно воспроизводить каждый раз, когда мне нужно использовать этот объект в реальном мире». Если я передаю соединение db в конструктор mapper в настройке, это нормально, но разве это не значит, что мне придется передавать живое соединение db в конструктор объекта mapper каждый раз, когда я действительно хочу его использовать? Представьте, что у вас есть все виды мест, где вам нужно получить или сохранить бизнес-объект, и что для использования объекта отображения данных вам необходимо каждый раз передавать соединение db?
В моем случае я пытаюсь установить тесты для этих объектов отображения данных, которые достигают следующего:
- Не требуется, чтобы объект подключения к базе данных создавался и передавался в каждый метод класса mapper.
- Не требуется, чтобы контрольный пример либо подключался к реальной базе данных, либо создавал действительную, но "тестовую" базу данных на лету для каждого метода тестирования.
В основном я видел два предложения: передать объект соединения в качестве параметра (о котором я уже говорил) или расширить класс SUT только для теста и переопределить любой процесс установки соединения БД, который у вас есть в реальном мире, для использования макета система вместо.
Мне любопытно, сталкивался ли кто-нибудь еще с этими проблемами на каком-либо языке, и что вы сделали для их решения? Может быть, есть что-то очевидное, чего мне не хватает?