我有一个系统,它在收到消息后将其排入队列(写入表),另一个进程轮询数据库并将其出列以进行处理。在我的自动测试中,我在同一个过程中合并了操作,但不能(从概念上)合并来自这两个操作的 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 进程上。
帮助?