Случайная ошибка при тестировании с NHibernate на базе данных SQLite в памяти

У меня есть система, которая после получения сообщения ставит его в очередь (записывает в таблицу), а другой процесс опрашивает БД и выводит из очереди для обработки. В своих автоматических тестах я объединил операции в одном процессе, но не могу (концептуально) объединить сеансы 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.

Помощь?

8
задан Arielr 14 April 2011 в 11:57
поделиться