我有一个索引:
public class FreeSearchIndex :
AbstractIndexCreationTask<Post, FreeSearchIndex.Result>
{
public FreeSearchIndex()
{
Map = posts => from post in posts
select new
{
Query = post.Tags.Concat(new[]
{
post.Title,
post.Body
}),
DatePosted = post.Date
};
Index(x => x.Query, FieldIndexing.Analyzed);
}
public class Result
{
public object[] Query { get; set; }
public DateTime DatePosted { get; set; }
}
}
并有方法:
public List<Post> Filter(string freeSearch)
{
IQueryable<Post> posts;
var posts = documentSession
.Query<FreeSearchIndex.Result, FreeSearchIndex>()
.Where(x => x.Query == (object)freeSearch)
.OrderByDescending(x => x.DatePosted)
.As<Post>();
return posts.ToList();
}
并进行单元测试:
[SetUp]
public void Setup()
{
store = new EmbeddableDocumentStore
{
RunInMemory = true
};
store.Initialize();
session = store.OpenSession();
IndexCreation.CreateIndexes(typeof(FreeSearchIndex).Assembly, store);
}
[Test]
public void GivenFreeSearchPhrase_Filter_ShouldOutputFilteredPostsByGivenPhrase()
{
session.Store(new Post { Body = "universal answer to everything is 42" });
session.SaveChanges();
var posts = Filter("everything");
Assert.AreEqual(1, posts.Count);
}
它失败了,因为查询返回0个帖子。我该如何解决这个问题?我应该检查生成的查询,是否可以检查它如何索引存储中的字段(在内存中)?
答案 0 :(得分:4)
我怀疑索引器没有时间处理新数据。您可能会不时地通过此测试,具体取决于机器负载,CPU和内存性能。据我所知,您需要在单元测试中使用某种WaitForStale
解决方案。
我是从github上的RavenOverflow应用程序获得的。
public abstract class RavenDbFactBase : IDisposable
{
public class NoStaleQueriesListener : IDocumentQueryListener
{
public void BeforeQueryExecuted(IDocumentQueryCustomization c)
{
c.WaitForNonStaleResults();
}
}
}
在生产中,你不会使用它,只是快速带来过时的数据。