Немного предыстории:
У меня есть веб-приложение, которое читает денормализованный набор документов, хранящихся в RavenDB. Эти документы создаются и изменяются обработчиками событий. В рабочей среде приложение использует стандартное хранилище документов, которое подключается к удаленной базе данных через API C#.
Когда я модульно тестирую приложение, я настраиваю обработчики для использования встроенной базы данных в памяти, создаю некоторые события и запрашиваю ожидаемые документы. Это работает абсолютно нормально.
Написание UI-тестов:
Я хочу, чтобы наши тестировщики могли писать автоматические тесты пользовательского интерфейса с использованием SpecFlow и Selenium. При реализации этого для других приложений (с использованием SQL) выполнение файлов функций подготовит среду тестирования:
- Создание новой базы данных в локальном экземпляре SQLExpress (по соглашению все имеют одинаковое имя экземпляра на своих машинах)
- Перенастройте обработчики для использования новой базы данных и вызовите события для создания желаемого состояния.
- Скопируйте тестируемое веб-приложение в новое временное расположение и перенастройте его для чтения из новой базы данных.
- Запустите веб-приложение в IIS Express (еще раз все следуют этому соглашению)
- Запустите функцию (ы), очистив и перестроив состояние между каждым, если это необходимо.
- Остановите IIS, удалите тестируемое приложение и удалите базу данных.
Теперь я хотел бы следовать тому же подходу, используя Raven, и рассматриваю два подхода.
Во-первых, следовать той же модели, что и выше. Проблемы, которые у меня есть, заключаются в том, как/где хранить базы данных и как их потом привести в порядок. Исполняемый файл сервера можно было запускать и останавливать программно во время установки и демонтажа, а базу данных можно было впоследствии удалить, удалив файл. Я не пробовал, но по идее должно работать.
Второй — следовать аналогичному подходу, но заменить стандартное хранилище документов встроенным (не работающим в памяти). Чтобы это работало, мне нужно изменить IoC (возможно, при использовании конфигурации в xml) веб-приложения, чтобы преобразовать IDocumentStore в EmbeddedDocumentStore. Затем я создаю состояние с помощью обработчиков, как и раньше, затем удаляю хранилище документов обработчиков перед запуском IIS (похоже, невозможно одновременно запускать два приложения, которые используют одну и ту же встроенную базу данных, если я не пропускаю что-то).
Второй подход изначально казался лучшим выбором, но я столкнулся с некоторым странным поведением, когда документы, созданные обработчиками, не согласуются с результатами, возвращаемыми, когда веб-приложение запрашивает его. В частности, некоторые дочерние коллекции заполняются обработчиками, но остаются пустыми при возврате из запроса, выполняемого веб-приложением. Честно говоря, я не был слишком удивлен, так как сомневаюсь, что это тот сценарий, в котором предполагалось использовать встроенные базы данных. Кроме того, очень сложно просматривать встроенную базу данных через студию управления, когда я перескакиваю с одного приложения на другое.
Так или иначе, после этого длинного описания мне любопытно, что другие думают об этих подходах, и есть ли лучшая альтернатива, которую я упускаю. Кроме того, я уверен, что есть много скрытых драгоценных камней RavenDB, о которых я не знаю, поэтому любые указатели в этом направлении также будут полезны.