Unit testing nhibernate模式生成后的SQLite数据库验证

Unit testing nhibernate模式生成后的SQLite数据库验证,unit-testing,nhibernate,sqlite,Unit Testing,Nhibernate,Sqlite,在使用NHib的模式生成工具之后,最简单最有效的方法是什么来验证您的SQLite db是否确实存在 干杯, 贝里尔 编辑 我希望有一些与ISession相关的东西(比如连接属性)可以测试;有时,当运行一系列测试时,它看起来像是一个良好的会话(IsOpen&IsConnected为true),但数据库不在那里(对它的查询会得到一个错误,如“没有这样的表”) 编辑-我现在正在做什么 连接字符串和其他属性 public static Configuration GetSQLiteConfig()

在使用NHib的模式生成工具之后,最简单最有效的方法是什么来验证您的SQLite db是否确实存在

干杯,
贝里尔

编辑

我希望有一些与ISession相关的东西(比如连接属性)可以测试;有时,当运行一系列测试时,它看起来像是一个良好的会话(IsOpen&IsConnected为true),但数据库不在那里(对它的查询会得到一个错误,如“没有这样的表”)

编辑-我现在正在做什么

连接字符串和其他属性

public static Configuration GetSQLiteConfig()
    {
        return new Configuration()
            .SetProperty(ENV.Dialect, typeof (SQLiteDialect).AssemblyQualifiedName)
            .SetProperty(ENV.ConnectionDriver, typeof (SQLite20Driver).AssemblyQualifiedName)
            .SetProperty(ENV.ConnectionString, "Data Source=:memory:;Version=3;New=True;Pooling=True;Max Pool Size=1")
            .SetProperty(ENV.ProxyFactoryFactoryClass, typeof (ProxyFactoryFactory).AssemblyQualifiedName)
            .SetProperty(ENV.ReleaseConnections, "on_close")
            .SetProperty(ENV.CurrentSessionContextClass, typeof (ThreadStaticSessionContext).AssemblyQualifiedName);
    }
我现在如何测试db,因为缺少更好的东西(这将测试映射)

现在,这一切可能都是过度设计的,但我需要多个数据库连接,而且我一直难以保持它的简单性和工作性。一个问题也有很多信息,但也许其他人真的把这些都归结为一门科学。下面的测试在它自己的测试夹具中运行良好,但不能与其他测试结合使用

    [Test]
    public void Schema_CanGenerateNewDbWithSchemaApplied()
    {
        DbMappingTestHelpers.VerifyAllMappings(_dbContext.FactoryContext.Factory, _dbContext.Session);
    }
贝里尔

就我所见,您正在与映射的实体进行斗争,因为您使用的是不同的连接。是否有任何要求要求您使用多个“真实”DB连接?我的意思是,您的测试是否可以共享同一个会话(逻辑上)?如果没有,您只需将数据库配置为:

      <property name="connection.connection_string">Data Source=NonTransactionalDB.txt;Version=3;New=True;Pooling=True;Max Pool Size=1;</property>
数据源=NonTransactionalDB.txt;版本=3;新=正确;池=真;最大池大小=1;
它的重要部分是池选项。由于每个会话都会使用相同的连接,因此每次重新创建模式都不会有问题

但是,重要的是要记住,它给您带来了一些关于交易的限制,并行运行测试可能会带来问题(比如“数据库文件被锁定”异常)

干杯


Filipe

Berryl,为了便于形象化,我将发布另一个答案。如果有帮助,请随时给我另一个答案。:)

下面是我用来检查NH配置对象是否正确配置的代码

        // assert: verify some properties just to see if connection properties were applyed ane entities mapped
        Assert.AreEqual<string>(cfg.Properties["connection.connection_string"], @"Server=localhost;Initial Catalog=MoveFrameworkDataNHibernate;User Id=sa;Password=sa");
        Assert.AreEqual<string>(cfg.Properties["dialect"], "NHibernate.Dialect.MsSql2000Dialect");
        Assert.IsNotNull(cfg.GetClassMapping(typeof(MappedEntity)));
在本例中,我能想到的最后一个选项是使用EXISTS检查直接向您的数据库执行SQL。我不知道EXISTS命令在所有DBs实现之间有多不可知,但对于我们在这里讨论的简单检查来说,这应该不是一个大问题

希望这有帮助

顺便说一句:它是jfneis。Neis是一个姓氏。与炸薯条、炸薯条或类似食物无关。:)

干杯


Filipe

是-这解决了我的单元测试问题!不,我想,就需要不止一个“真实”连接而言(还不确定“真实”是什么意思)。我需要两个并发连接,用于桌面应用程序中的两个db。不过,我确实需要事务,所以即使是一些事务测试,我似乎也在工作,”NonTransactionalDB.txt“听起来不太好。如果我确实需要或最终需要多个“真正的”连接呢?Cheers@jfries-哦,是的,您有什么技巧来测试SQLite db是否可用?Cheers@Berryl:NonTransactionalDB.txt是一个坏例子。它与一些NH配置类的内部单元测试有关。由于SQLite不能在每个连接中处理多个事务,因此,是的,不能同时打开两个不同的事务(它将引发锁定的数据库异常)。我将用这些信息更新我的答案。@Berryl:配置数据库后,我们只是测试它是否配置正确。我们通过检查Configuration.Properties和Configuration.GetClassMapping来实现这一点。@jFries:我现在正在对它运行查询,如果没有数据库,查询显然会失败,我希望有更方便的方法来测试数据库是否可用。不确定验证cfg输入是否意味着您有一个工作的db,但可能我没有找到它。你能给我看看你的密码吗?干杯
      <property name="connection.connection_string">Data Source=NonTransactionalDB.txt;Version=3;New=True;Pooling=True;Max Pool Size=1;</property>
        // assert: verify some properties just to see if connection properties were applyed ane entities mapped
        Assert.AreEqual<string>(cfg.Properties["connection.connection_string"], @"Server=localhost;Initial Catalog=MoveFrameworkDataNHibernate;User Id=sa;Password=sa");
        Assert.AreEqual<string>(cfg.Properties["dialect"], "NHibernate.Dialect.MsSql2000Dialect");
        Assert.IsNotNull(cfg.GetClassMapping(typeof(MappedEntity)));
        tx.Session.SessionFactory.GetClassMetadata(typeof(MappedEntity)) != null