Инициализация тестов интеграции SQLite / Fluent NHibernate не повторяется после большого сеанса данных - PullRequest
2 голосов
/ 13 июня 2010

В одном из моих основных наборов тестов интеграции данных я создаю и использую Fluent NHibernate SingleConnectionSessionSourceForSQLiteInMemoryTesting, чтобы получить новый сеанс для каждого теста. После каждого теста я закрываю фабрику соединений, сеансов и сеансов и выбрасываю вложенный вложенный StructureMap контейнер, из которого они пришли. Это работает практически для любого простого теста интеграции данных, который я могу себе представить, включая тесты, использующие объект PersistenceSpecification Fluent NHib.

Проблема начинается, когда я тестирую длительный процесс начальной загрузки базы данных приложения, который создает и сохраняет тысячи объектов домена. Дело не в том, что первая установка и демонтаж тестового набора завершается неудачей, на самом деле тестовый набор успешно загружает базу данных в памяти, поскольку приложение запускает реальную базу данных в производственной среде. Проблема возникает, когда база данных загружается во второй раз в новую базу данных в памяти с новым сеансом и фабрикой сеансов.

Ошибка:

NHibernate.StaleStateException : Unexpected row count: 0; expected: 1

row count действительно Unexpected, строка, которую ищет тестируемое приложение, должна находиться в сеансе. Видите ли, дело не в том, что какие-то данные из последнего интеграционного теста торчат, а в том, что по какой-то причине сессия просто перестает работать mid-database-boostrap. И я везде искал место, где мог бы придерживаться старой сессии, и я не могу ее найти.

Я искал код для static синглтонов объектов, но нигде рядом с рассматриваемым кодом нет. У меня есть пара StructureMap InstanceScope singleton's, но они выбрасываются с каждым вложенным контейнером, который теряется после каждого демонтажа теста.

Я испробовал все возможные варианты размещения и закрытия каждого объекта, связанного с каждым тестовым демонтажем, и он все еще не удался на этой длительной загрузке базы данных. Я даже бездельничал с current_session_context_class безрезультатно. Но не связанные с начальной загрузкой тесты базы данных работают нормально. У меня заканчиваются варианты, и мне, возможно, придется отказаться от длительных интеграционных тестов в пользу приемочных тестов на основе WatiN.

Может кто-нибудь подсказать, как я могу понять, почему некоторые из моих SingleConnectionSessionSourceForSQLiteInMemoryTesting не повторяются?

Советы, как сделать так, чтобы тестовый комплекс интеграции NHibernate SqlLite повторялся для больших сеансов данных?

Ответы [ 2 ]

1 голос
/ 12 марта 2011

Вот как мы это делаем http://www.gears4.net/blog/archive/14/nhibernate-integration-testing Надеюсь, это поможет

0 голосов
/ 13 июля 2010

Мне удалось решить эту проблему, не используя базу данных в памяти, а вместо этого сохранив файл в твердой копии после инициализации, один раз за запуск набора тестов.Затем вместо повторной инициализации базы данных после каждого теста копируется файловая база данных SqlLite, и эта новая копия используется для тестирования.

По сути, я только один раз настраиваю исходные данные базы данных и сохраняю эту базу данных всторона, и это копируется для каждого теста.Существует определенная вероятность того, что проблема может быть на моем конце, но я подозреваю, что есть проблема с большими базами данных SqlLite в памяти.Поэтому я рекомендую использовать файловый режим базы данных, если у вас проблемы с большой базой данных sqllite в памяти.

...