У меня есть система, которая после получения сообщения ставит ее в очередь (записывает в таблицу), а другой процесс опрашивает БД и удаляет ее из очереди для обработки. В моих автоматических тестах я объединил операции в одном и том же процессе, но не могу (концептуально) объединить сеансы NH из двух операций.
Естественно - проблемы возникают.
Я прочитал все, что мог, чтобы заставить комбинацию SQLite-InMemory-NHibernate работать в мире тестирования, но теперь я столкнулся с СЛУЧАЙНО провальными тестами из-за ошибок "нет такой таблицы". Чтобы было понятно - «случайный» означает, что один и тот же тест с одинаковой точной конфигурацией и кодом иногда не удался.
У меня есть следующая конфигурация SQLite:
return SQLiteConfiguration
.Standard
.ConnectionString(x => x.Is("Data Source=:memory:; Version=3; New=True; Pooling=True; Max Pool Size=1;"))
.Raw(NHibernate.Cfg.Environment.ReleaseConnections, "on_close");
В начале моего теста (каждого теста) я выбираю «статического» поставщика сеанса и прошу его очистить существующую БД и заново создать схему:
public void PurgeDatabaseOrCreateNew()
{
using (var session = GetNewSession())
using (var tx = session.BeginTransaction())
{
PurgeDatabaseOrCreateNew(session);
tx.Commit();
}
}
private void PurgeDatabaseOrCreateNew(ISession session)
{
//http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx
new SchemaExport(_Configuration)
.Execute(false, true, false, session.Connection, null);
}
Так что да, он находится в другом сеансе, но соединение объединено в SQLite, поэтому следующий созданный мной сеанс увидит сгенерированную схему. Тем не менее, хотя в большинстве случаев это работает, иногда последующая операция «enqueue» завершается сбоем, потому что она не может видеть таблицу для моих входящих сообщений.
Кроме того - кажется, что это происходит максимум один или два раза за запуск набора тестов; не все тесты проваливаются, только первый (а иногда и другой. Не совсем уверен, второй это или нет).
Худшая часть - это случайность, естественно. Я сказал себе, что исправил это несколько раз, просто потому, что он просто «перестал работать». Наугад.
Это происходит в FW4.0, версии System.Data.SQLite x86, Win7 64b и 2008R2 (всего три разных компьютера), NH2.1.2, настроенных с помощью FNH, в процессах TestDriven.NET 32b и процессах консоли NUnit 32b.
Помощь