c# – 测试过程中如何处理失效索引?

前端之家收集整理的这篇文章主要介绍了c# – 测试过程中如何处理失效索引?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在内存模式下使用RavenDB进行单元测试.我的查询由静态索引支持.我没有使用WaitForNonStaleResults()API(也不想).

测试的典型工作流程是:

>在内存模式下初始化RavenDB
>使用IndexCreation.CreateIndexes(Assembly,IDocumentStore)集成索引
>插入测试数据(用于验证查询行为)
>运行查询
>验证查询输出

我注意到第1-3步发生得很快,静态索引没有时间在第4步之前进行更新,因此索引是陈旧的.

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

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

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

>在内存模式下运行RavenDB时,索引出现故障是否正常?
>在测试过程中是否有更好的方法来避免陈旧的索引?

解决方法

交叉发布到 RavenDB usergroup,并有一个工作的解决方案.

Is it normal for indexes to be stale when running RavenDB in In-Memory
mode?

是.索引是索引.

Is there a better way to avoid stale indexes during testing?

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

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

store.Initialize();

注意:ConsistencyOptions.QueryYourWrites不适用于Map / Reduce索引,即使用Reduce => … 部分.对于这些,您必须在查询时使用自定义(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();
    }
}

猜你在找的C#相关文章