我正在进行集成测试。由于我们使用NServiceBus Saga和ravendb作为存储,对于集成测试,我需要删除每个测试用例的乌鸦存储中的所有文档。由于这是一个NServiceBus saga商店,Raven Db中的文档类型在集成测试中是未知的。基本上我需要阅读所有文件(任何类型)并删除它们。我期待在ravendb会话中编写一个查询,以从特定数据库中检索所有文档。当我检查Raven Db Query方法时,它期望文档的类型。而我需要查询数据库中没有类型的所有文档。仅作为这次整合测试,乌鸦商店将不会有太多记录。因此,性能不是问题。
以下是我要执行的查询。
"from doc in docs let DocId = doc[\"@metadata\"][\"@id\"] select new {DocId};"
解决方案1:
我还试图为上面的查询创建索引并执行DeleteByIndex。这实际上删除了数据库中的所有文档。但它适用于某些测试用例,并在另一个测试用例中抛出异常,说明" Stale Index"。我还找到了一个解决方案,代码可以等到索引完成以避免过时的异常。或者将allowstale设置为true以避免此异常。我认为,而不是通过所有索引的东西,为什么我只能写一个查询来检索所有文件并删除它们。
解决方案2: 我找到了另一个删除ravendb文档文件夹的解决方案。这对我的情况不起作用,因为如果NServiceBus windows处理器运行时数据库被删除,NServices总线将抛出异常。这打破了我们的集成测试用例。集成测试将在与ravendb机器不同的机器上运行的另一个原因。因此,集成测试框可能无法访问ravendb box的文件夹。
这些是我希望编写查询以从数据库中获取所有文档并删除它们的所有原因。
感谢任何帮助。
答案 0 :(得分:1)
我建议您使用Raven在集成测试中作为内存数据库运行的能力。这将为您提供一个完全新鲜的数据库。
对于您的测试,而不是DocumentStore
,创建EmbeddableDocumentStore
(也实现IDocumentStore
)并使用RunInMemory
配置选项。
答案 1 :(得分:0)
虽然有可用于注入内存数据库的选项,但我现在要使用以下路由。但是我会将另一个答案标记为已经回答,因为使用内存数据库是有意义的。
此代码删除raven数据库中的所有文档。为简单起见,忽略了documentstore对象初始化
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();
}