Я пытаюсь провести модульное тестирование сохранения EventStore, используя сериализацию JSON и Sqlite, работающий в режиме памяти. Я получаю исключение «Нет такой таблицы: фиксации» во время инициализации EventStore. Я предполагаю, что это связано с тем, что EventStore каким-то образом закрывает соединение и открывает новое, заставляя его видеть новый экземпляр Sqlite в памяти (без таблицы Commits). Есть ли способ заставить это работать?
NEventStore и Sqlite в памяти
Ответы (1)
Реализация SQLite интересна, особенно когда вы используете строку подключения ":memory:". Приемочные тесты, связанные с реализацией, зависят от того, не исчезает ли база данных между операциями.
Фундаментальный дизайн EventStore разделяет каждое дискретное действие на отдельную операцию, которая:
- В зависимости от конфигурации зачисляется в окружающий TransactionScope (если есть)
- Открывает соединение
- Создает команду IDbCommand
- Выполняет команду IDbCommand
- Оценивает результаты
- Удаляет соединение (выпуская его обратно в пул)
- Завершает TransactionScope (когда исключения не выдаются)
- Удаляет TransactionScope
Проблема, с которой вы сталкиваетесь, заключается в том, что каждый вызов EventStore открывает и закрывает соединение.
Теперь есть способ обойти это, потому что я хотел поддерживать явное использование того же IDbConnection, не выпуская его обратно в пул. EventStore v3.0 (который находится на стадии кандидата на выпуск) имеет вызов метода, который использует одно и то же соединение и позволяет избежать разрыва соединения после каждой операции:
ConfigurationConnectionFactory.OpenScope("SQLite"); // SQLite = app.config connection key
Просто добавьте это в класс приемочных тестов «using_the_persistence_engine», и все готово:
private static IDisposable scope;
Добавьте это в качестве первой строки в «Установить контекст»:
scope = ConfigurationConnectionFactory.OpenScope("SQLite");
Наконец, последняя строка в «Очистить все» должна быть:
scope.Dispose();