如何在测试期间处理陈旧的索引?

时间:2012-01-30 03:10:59

标签: c# testing ravendb indexing

我在In-Memory模式下使用RavenDB进行单元测试。我的查询由静态索引支持。我没有使用WaitForNonStaleResults() API(我也不想)。

测试的典型工作流程是:

  1. 在内存模式下初始化RavenDB
  2. 使用IndexCreation.CreateIndexes(Assembly, IDocumentStore)
  3. 集成索引
  4. 插入测试数据(用于验证查询行为)
  5. 运行查询
  6. 验证查询输出
  7. 我注意到步骤1-3发生得太快,静态索引没有时间在步骤4之前得到更新 - 因此索引是陈旧的。

    我为此创建了一个快速的解决方案。在第3步之后,我执行:

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

    这感觉很麻烦。我想知道的是:

    • 在In-Memory模式下运行RavenDB时索引是否正常?
    • 在测试期间有没有更好的方法来避免过时的索引?

1 个答案:

答案 0 :(得分:14)

将此交叉发布到RavenDB usergroup,并提供有效的解决方案。

  

在In-Memory中运行RavenDB时索引是否过时是否正常?   模式?

是。索引是索引。

  

在测试期间是否有更好的方法来避免过时的索引?

是。初始化文档存储时配置全局约定:

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

store.Initialize();

注意: ConsistencyOptions.QueryYourWrites不适用于Map / Reduce索引,即带有Reduce => ...部分的索引。对于这些,您必须在查询时使用Customize(x => x.WaitForNonStale...())

更新:another approach,可能会更好(尚未亲自尝试过)。您可以实现IDocumentQueryListener以强制所有查询返回非陈旧结果:

var store = new EmbeddableDocumentStore { RunInMemory = true };
store.Initialize();

store.RegisterListener(new ForceNonStaleQueryListener());

public class ForceNonStaleQueryListener : IDocumentQueryListener
{
    public void BeforeQueryExecuted(IDocumentQueryCustomization customization)
    {
        queryCustomization.WaitForNonStaleResults();
    }
}