1

我正在做集成测试。由于我们使用 NServiceBus Saga 和 ravendb 作为存储,因此对于集成测试,我需要为每个测试用例删除 raven 存储中的所有文档。由于这是一个 NServiceBus 传奇存储,因此 Raven Db 中的文档类型在集成测试中是未知的。基本上我需要阅读所有文件(任何类型)并删除它们。我期待在 ravendb 会话中编写查询,以从特定数据库中检索所有文档。当我检查 Raven Db Query 方法时,它期望文档的类型。而我需要在没有类型的情况下查询数据库中的所有文档。仅供参考,因为这是集成测试,raven store 不会有很多记录。所以性能不是问题。

这是我要执行的查询。

"from doc in docs let DocId = doc[\"@metadata\"][\"@id\"] select new {DocId};"

解决方案 1:

我还尝试为上述查询创建索引并执行 DeleteByIndex。这实际上删除了数据库中的所有文档。但它适用于某些测试用例,并在另一个测试用例中抛出异常,说“陈旧索引”。我还找到了一个解决方案,代码可以等到索引完成以避免过时的异常。或者将 allowtale 设置为 true 以避免此异常。我认为与其遍历所有索引内容,为什么我不能只编写一个查询来检索所有文档并删除它们。

解决方案2:我找到了另一个删除ravendb文件夹的解决方案。这不适用于我的情况,因为如果在 NServiceBus Windows 处理器运行时删除数据库,NServices 总线将引发异常。这打破了我们的集成测试用例。集成测试将在与 ravendb 机器不同的机器上运行的另一个原因。因此集成测试盒可能无法访问 ravendb 盒的文件夹。

这些都是我希望编写查询以从数据库中获取所有文档并删除它们的所有原因。

任何帮助表示赞赏。

4

2 回答 2

1

我建议您使用 Raven 在集成测试中作为内存数据库运行的能力。这将在您需要时为您提供一个全新的数据库。

对于您的测试,而不是 a DocumentStore,创建一个EmbeddableDocumentStore(也实现IDocumentStore)并使用RunInMemory配置选项。

于 2013-05-17T18:24:19.880 回答
0

尽管有一些选项可用于注入内存数据库,但我现在将采用以下路线。但我会将另一个答案标记为已回答,因为使用内存数据库是有意义的。

此代码删除 raven 数据库中的所有文档。为简单起见忽略文档存储对象初始化

 using (var session = documentStore.OpenSession(database))
            {
                var result = session.Advanced.LuceneQuery<dynamic>()
                       .SelectFields<dynamic>("@metadata")
                       .Select<dynamic, string>(x => x["__document_id"])
                       .ToArray();

                var loadedDocuments = session.Load<dynamic>(result);
                foreach (var document in loadedDocuments)
                {
                    session.Delete(document);
                }
                session.SaveChanges();
            }
于 2013-05-19T13:59:03.293 回答