Eventstore и Sqlite в памяти - PullRequest
       6

Eventstore и Sqlite в памяти

2 голосов
/ 21 октября 2011

Я пытаюсь выполнить модульное тестирование сохранности EventStore, используя сериализацию JSON и Sqlite, работающие в режиме памяти.Я получаю исключение "Нет такой таблицы: фиксирует" во время инициализации EventStore.Я предполагаю, что это потому, что EventStore каким-то образом закрывает соединение и открывает новое, заставляя его видеть новый экземпляр Sqlite в памяти (таблица sans Commits).Есть ли способ заставить эту работу?

1 Ответ

2 голосов
/ 28 октября 2011

Реализация SQLite интересна, особенно когда вы используете строку подключения ": memory:".Приемочные тесты, связанные с реализацией, зависят от того, не исчезнет ли база данных между операциями.

Фундаментальный дизайн EventStore разделяет каждое отдельное действие на отдельную операцию, которая:

  1. В зависимостипосле настройки зачисляется в окружающий TransactionScope (если есть)
  2. Открывает соединение
  3. Создает IDbCommand
  4. Выполняет IDbCommand
  5. Оценивает результаты
  6. Удаляет соединение (освобождает его обратно в пул)
  7. Завершает TransactionScope (когда не генерируются исключения)
  8. Удаляет 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();
...