メッセージを受け取った後、それをエンキュー(テーブルに書き込む)するシステムがあり、別のプロセスがDBをポーリングし、処理のためにデキューします。自動テストでは、同じプロセスで操作をマージしましたが、(概念的には)2つの操作からの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");
テストの開始時(すべてのテスト)に、「静的」セッションプロバイダーをフェッチし、既存のDBをクリーンにフラッシュして、スキーマを再作成するように依頼します。
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にプールされているので、次に作成するセッションには生成されたスキーマが表示されます。それでも、ほとんどの場合は機能しますが、受信メッセージのテーブルが表示されないため、後の「エンキュー」操作が失敗することがあります。また、これはテストスイートの実行ごとに最大1回または2回発生するようです。すべてのテストが失敗するわけではなく、最初のテストだけが失敗します(場合によっては別のテストも失敗します。2番目かどうかはよくわかりません)。
最悪の部分は、当然、ランダム性です。単に「失敗を止めた」という理由だけで、これを数回修正したと自分に言い聞かせました。無作為に。
これは、FW4.0、System.Data.SQLite x86バージョン、Win7 64bおよび2008R2(合計3つの異なるマシン)、FNHで構成されたNH2.1.2、TestDriven.NET32bプロセスおよびNUnitコンソール32bプロセスで発生します。
ヘルプ?