Тестирование NHibernate с SQLite "No Such Table" - генерируется схема - PullRequest
4 голосов
/ 01 декабря 2010

Я пытаюсь использовать базу данных SQLite в памяти для тестирования своего слоя данных, предоставляемого NHibernate.

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

Проблема - когда я запускаю модульный тест, я получаю сообщение об ошибке «нет такой таблицы: студент».Статьи, которые я прочитал, предполагают, что это связано с тем, что схема не генерируется или соединение между моим SchemaExport и запросом закрыто.Я проверил везде, где только могу придумать и не вижу, как происходит любой из этих сценариев.

Мой журнал результатов теста выглядит следующим образом:

OPEN CONNECTION

drop table if exists "Student"

drop table if exists "Tutor"

create table "Student" (
    ID  integer,
   Name TEXT,
   DoB DATETIME,
   TutorId INTEGER,
   primary key (ID)
)

create table "Tutor" (
    ID  integer,
   Name TEXT,
   primary key (ID)
)
NHibernate: INSERT INTO "Student" (Name, DoB, TutorId) VALUES (@p0, @p1, @p2); select last_insert_rowid();@p0 = 'Text1', @p1 = 01/12/2010 14:55:05, @p2 = NULL
14:55:05,750 ERROR [TestRunnerThread] AbstractBatcher [(null)]- Could not execute query: INSERT INTO "Student" (Name, DoB, TutorId) VALUES (@p0, @p1, @p2); select last_insert_rowid()
System.Data.SQLite.SQLiteException (0x80004005): SQLite error

no such table: Student

at System.Data.SQLite.SQLite3.Prepare(String strSql, SQLiteStatement previous, String& strRemain)

at System.Data.SQLite.SQLiteCommand.BuildNextCommand()

at System.Data.SQLite.SQLiteCommand.GetStatement(Int32 index)

at System.Data.SQLite.SQLiteDataReader.NextResult()

at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)

at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)

at System.Data.SQLite.SQLiteCommand.ExecuteDbDataReader(CommandBehavior behavior)

at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()

at NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)

14:55:05,781 ERROR [TestRunnerThread] ADOExceptionReporter [(null)]- SQLite error
no such table: Student
DISPOSE
CLOSING CONNECTION

Изначально я использовал свой собственный код для управления подключением / сеансом, но перешел к коду в этом сообщении в блоге переведено на C # и с парой изменений в методе DBConfig и некоторых инструкциях отладки, чтобы показать состояние соединения.

private FluentNHibernate.Cfg.Db.IPersistenceConfigurer GetDBConfig()
{
    return SQLiteConfiguration.Standard
                               .ConnectionString((ConnectionStringBuilder cs) => cs.Is(CONNECTION_STRING))
                               .ProxyFactoryFactory("NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu")
                               .Raw("connection.release_mode", "on_close");
}

Я добавил on_close после прочтения this

Мой тестовый код выглядит следующим образом:

[Test]
public void CanGetStudentById()
{
    using (var scope = new SQLiteDatabaseScope<StudentMapping>())
    {
        using (ISession sess = scope.OpenSession())
        {
            // Arrange
            var repo = new StudentRepository();
            repo.Save(new Student() { Name = "Text1", DoB = DateTime.Now });

            // Act
            var student = repo.GetById(1);

            // Assert
            Assert.IsNotNull(student);
            Assert.AreEqual("Text1", student.Name);
        }
   }
}

Что я здесь упустил?

Обновление: Я создал копию класса, который подключается кфайловая БД SQLite и все работало нормально.Так что это должно быть как-то связано с закрытием соединения.

1 Ответ

3 голосов
/ 01 декабря 2010

Если вы измените свой метод тестирования на следующий, он работает?

[Test]
public void CanGetStudentById()
{
    using (var scope = new SQLiteDatabaseScope<StudentMapping>())
    {
        using (ISession sess = scope.OpenSession())
        {
            // Arrange
            sess.Save(new Student() { Name = "Text1", DoB = DateTime.Now });

            // Act
            var student = sess.Get<Student>(1);

            // Assert
            Assert.IsNotNull(student);
            Assert.AreEqual("Text1", student.Name);
        }
   }
}

Я бы рискнул предположить, что ваш StudentRepository открывает собственный сеанс и, следовательно, не видит таблицу.*

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