SQLite/Fluent NHibernate集成测试线束初始化在大数据会话后不可重复

SQLite/Fluent NHibernate集成测试线束初始化在大数据会话后不可重复,nhibernate,sqlite,fluent-nhibernate,integration-testing,Nhibernate,Sqlite,Fluent Nhibernate,Integration Testing,在我的一个主要数据集成测试工具中,我创建并使用Fluent NHibernate的SingleConnectionSessionSource for QliteinMemoryTesting,为每个测试获得一个新的会话。每次测试之后,我关闭连接、会话和会话工厂,并抛出它们来自的嵌套StructureMap容器。这适用于我能想到的几乎任何简单的数据集成测试,包括使用Fluent NHib的PersistenceSpecification对象的测试 当我测试应用程序冗长的数据库引导过程时,问题就开始

在我的一个主要数据集成测试工具中,我创建并使用Fluent NHibernate的
SingleConnectionSessionSource for QliteinMemoryTesting
,为每个测试获得一个新的会话。每次测试之后,我关闭连接、会话和会话工厂,并抛出它们来自的嵌套StructureMap容器。这适用于我能想到的几乎任何简单的数据集成测试,包括使用Fluent NHib的
PersistenceSpecification
对象的测试

当我测试应用程序冗长的数据库引导过程时,问题就开始了,该过程创建并保存了数千个域对象。并不是第一次安装和拆卸测试线束失败,事实上,测试线束成功地引导了内存中的数据库,因为应用程序将在生产环境中引导真实的数据库。当使用新的会话和会话工厂在新的内存中数据库上第二次引导数据库时,就会出现问题

错误是:

NHibernate.StaleStateException : Unexpected row count: 0; expected: 1
行计数
确实是
意外的
,被测试应用程序正在查找的行应该在会话中。你看,并不是上一次集成测试中的任何数据都被粘住了,而是由于某种原因,会话只是停止了中间数据库boostrap的工作。我到处寻找一个地方,我可能会保留一个旧的会议,但我找不到一个

我在代码中搜索了
static
singleton对象,但在相关代码附近没有任何对象。我有两个StructureMap
InstanceScope
singleton,但它们与每个嵌套容器一起被抛出,每个嵌套容器在每次测试拆卸后都会丢失

我尝试了各种可能的方法来处理和关闭每个测试拆卸涉及的对象,但在这个冗长的数据库引导过程中仍然失败。我甚至把
当前会话\u上下文\u类
弄得一团糟,但毫无用处。但与引导无关的数据库测试似乎工作正常。我开始没有选择了,我可能不得不放弃冗长的数据库集成测试,转而支持基于WatiN的验收测试

有人能给我一些线索,让我知道为什么QliteinMemoryTesting的某些
SingleConnectionSessionSource不可重复吗


关于如何使NHibernate SqlLite数据库集成测试线束可用于大型数据会话,有什么建议吗?

我可以通过不使用内存中的数据库,而是在初始化后保存硬拷贝文件来解决这个问题,每次测试套件运行一次。然后,不是在每次测试后重新初始化数据库,而是复制基于文件的SqlLite数据库,并将新副本用于测试

基本上,我只设置初始数据库数据一次,然后将该数据库保存到一旁,并为每个测试复制它。这个问题很可能是我的问题,但我怀疑内存中的大型SqlLite数据库存在问题。因此,如果您在使用大型内存中的sqllite数据库时遇到问题,我建议您使用数据库的文件模式。

下面是我们的做法
希望它有帮助

如果有人想在某处看到一些代码,请告诉我,我很乐意发布它。您可以发布一个示例装置吗(不必发布整个DB数据引导)?是的,我会的,谢谢您的关注。