Модульное тестирование приложения NHibernate с SQLite: оно пишет в базу данных, но не может прочитать обратно - PullRequest
1 голос
/ 29 июля 2010

У меня есть приложение, использующее NHibernate, которое уже развернуто и работает должным образом, и я переориентирую модульные тесты, чтобы использовать SQLite для повышения производительности и не допускать данных модульных тестов в «реальную» базу данных.

У меня есть простой тест, который создает объект календаря, сохраняет его, затем пытается прочитать его обратно и проверяет, что это тот же объект. Запись работает, но последующий выбор, чтобы прочитать ее обратно, возвращает 0 записей. Календарь имеет GUID в качестве первичного ключа, и я понимаю, что для этого требуется дополнительный параметр в строке подключения SQLite. Это моя строка подключения:

data source=:memory:;Version=3;New=true;Pooling=true;Max Pool Size=1;BinaryGuid=False

Через зарегистрированные операторы SQL, поступающие из NHibernate, я вижу вставки для записи сущности и ее зависимостей, а затем последующий оператор выбора. Все выглядит хорошо, но ничего не выбрано. Если я использую файловую базу данных вместо базы данных в памяти, я могу открыть таблицу в обозревателе серверов Visual Studio и увидеть правильные данные в таблицах. Если я напишу запрос, чтобы попытаться выбрать запись, например, так:

SELECT     CalendarID, Name, Description
FROM         dbo_Calendars
WHERE     (CalendarID = 'a9cd9820-1694-4645-88d4-f682c5a6b9cc')

он также не может ничего выбрать. Я думаю, что это проблема с обработкой GUID, но я сбит с толку.

Обновление

Вот как выглядит контрольный пример:

[Test]
    public void SaveAndLoadCalendar()
    {
        Guid calId;

        DAOFactory factory = (DAOFactory)DAOFactory;
        ISession s = factory.SessionManager.CurrentSession;
        using (var tx = s.BeginTransaction())
        {
            Calendar cal = new Calendar("Test Calendar", CalendarType.Test);
            cal.Active = true;
            cal.Browsable = true;
            s.Save(cal);

            tx.Commit();
            calId = cal.ID;
        }

        Logger.InfoFormat("Calendar ID is {0} ", calId);

        s.Clear();

        using (var tx2 = s.BeginTransaction())
        {
            Calendar cal = s.Get<Calendar>(calId);
            Assert.IsNotNull(cal, "Could not retrieve saved calendar");
            Assert.AreEqual("Test Calendar", cal.Name, "Saved calendar not equal to original calendar");
        }
    }

Ответы [ 2 ]

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

Я понял это, и проблема не в NHibernate или SQLite, а во мне.С каждым календарем связана тема.В нашей производственной базе данных они вводятся вручную и ожидаются заранее.Теперь, когда я использую SQLite для тестирования, я начинаю с пустой базы данных, и эти справочные данные предварительно не заполняются.Оператор Select NHibernate для извлечения Календаря использует внутреннее соединение таблицы Themes, и, если в этой таблице ничего нет, выбор будет возвращен пустым.D'oh.

После обновления кода настройки моего теста для сохранения темы по умолчанию тест проходит.

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

Я предполагаю, что проблема может быть в обработке транзакций.

Так что, возможно, транзакция, вставляющая запись, еще не зафиксирована, и поэтому (другая) транзакция, выполняющая выбор, еще не видит новые данные - поэтому выбор ничего не возвращает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...