2012-01-30 15 views
10

ユニットテストのために、In-MemoryモードでRavenDBを使用しています。私のクエリは静的インデックスによってサポートされています。私はWaitForNonStaleResults() APIを使用していません(私もしたいです)。テストのためのテスト中に失効したインデックスをどのように処理する必要がありますか?

典型的なワークフローは次のとおりです。インメモリモードで

  1. 初期化RavenDB
  2. (問合せの動作を検証するため)IndexCreation.CreateIndexes(Assembly, IDocumentStore)
  3. 挿入テストデータを使用してファイル名を指定して実行クエリ
  4. をインデックスを統合します
  5. 照会出力の照合

私はステップ1〜3がすばやく起こっていることに気付きました。静的インデックスはステップ4より前に更新される時間がないため、インデックスが古くなります。

私はこのための迅速な回避策を作成しました。手順3の後、私は実行します:

while (documentStore.DocumentDatabase.Statistics.StaleIndexes.Length != 0) 
    Thread.Sleep(10); 

これは面倒です。私が知りたいのは、次のとおりです。

  • インメモリーモードでRavenDBを実行しているときにインデックスが古くなってすることは正常ですか?
  • テスト中に失効したインデックスを回避する良い方法はありますか?

答えて

14

これをRavenDB usergroupにクロス投稿し、解決策があります。

In-Memory モードでRavenDBを実行しているときにインデックスが失効するのは正常ですか?

はい。インデックスはインデックスです。

テスト中に失効したインデックスを避けるより良い方法はありますか?

はい。ドキュメントストアを初期化するときに、グローバル規則を設定します。

var store = new EmbeddableDocumentStore(); 
store.RunInMemory = true; 
store.Conventions = new DocumentConvention 
{ 
    DefaultQueryingConsistency = ConsistencyOptions.QueryYourWrites 
}; 

store.Initialize(); 

注:ConsistencyOptions.QueryYourWritesは、地図では動作しません/削減指標、すなわちインデックスをReduce => ...セクションで。another approachがあり、(個人的にはまだそれを試していない)方が良いことがあります。これらについて、あなたは

更新を照会するときCustomize(x => x.WaitForNonStale...())を使用する必要があります。 IDocumentQueryListenerを実装すると、すべてのクエリが強制終了しない結果を返すように強制できます。

+0

@MattWarrenありがとうございます。知っておくと便利です。 –

+0

リスナーのアプローチは、現在のRavenDBビルドでは有効ではなくなりました。 – nathanchere

+0

@FerretallicA最新のビルドでこれを再度確認します。 –

関連する問題