У меня есть система, которая после получения сообщения ставит его в очередь (записывает в таблицу), а другой процесс опрашивает БД и выводит из очереди для обработки. В своих автоматических тестах я объединил операции в одном процессе, но не могу (концептуально) объединить сеансы 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, так что следующий сеанс, который я создаю, увидит сгенерированная схема. Тем не менее, хотя в большинстве случаев это работает - иногда более поздняя "постановка в очередь" Также - это, кажется, происходит максимум один или два раза за запуск набора тестов; не все тесты терпят неудачу, только первый (а иногда и другой. Не совсем уверен, второй это или нет).
Самым худшим моментом является случайность, естественно. Я сказал себе, что исправил это несколько раз, просто потому, что он просто «перестал давать сбои». Произвольно.
Это происходит на FW4.0, версии System.Data.SQLite x86, Win7 64b и 2008R2 (всего три разные машины), NH2.1.2, настроенном с помощью FNH, на прецессах TestDriven.NET 32b и консоли NUnit. 32b.
Помощь?