NEventStore и Sqlite в памяти

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


person friism    schedule 21.10.2011    source источник


Ответы (1)


Реализация 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();
person Jonathan Oliver    schedule 28.10.2011
comment
У меня такая же проблема в тесте интеграции Web Api. Не могу заставить ваше решение работать на меня. Пример: здесь Есть идеи? - person Martin Nilsson; 27.06.2012
comment
@MartinNilsson имеет ли это какое-либо отношение к проблемам x86/x64 с SQLite и вашим тестировщиком? - person Jonathan Oliver; 28.06.2012
comment
Кажется, это проблема с IQueryable и IEnumerable. https://gist.github.com/3009467 Примечание. Мне также нужно было добавить commits.ToArray() перед возвратом из метода - person Martin Nilsson; 28.06.2012