我正在使用 NancyFX + RavenDB。我目前正在尝试实施 Ayende 推荐的非规范化引用技术,以从 AggregateRoot 构建域引用。如果您阅读该链接,您会发现诀窍是加载父实例,然后使用 RavenDB 的“包含”语句预取引用的实例。
我已经完成了所有这一切,它似乎可以工作,但我正在努力通过单元测试来确定引用的实例是否真的是预取的。这是我的单元测试中的一个片段来说明:
[Fact]
public void Should_preload_the_mentor_mentee_references_to_improve_performance()
{
//Given
var db = Fake.Db();
var mentor = Fake.Mentor(db);
var mentee = Fake.Mentee(db);
var relationship = Fake.Relationship(mentor, mentee, db);
//When
relationship = db
.Include("Mentor.Id")
.Include("Mentee.Id")
.Load<Relationship>(relationship.Id);
mentor = db.Load<User>(relationship.Mentor.Id);
mentee = db.Load<User>(relationship.Mentee.Id);
//Then
relationship.ShouldNotBe(null);
mentor.ShouldNotBe(null);
mentee.ShouldNotBe(null);
}
上面的单元测试检查我是否可以从我的假数据库(它是 RavenDB 的内存中嵌入式实例)加载我的实例,但它不检查它们是否是预取的。
我想也许我可以使用 RavenProfiler。也许这会计算我可以断言的数据库请求的数量(例如,如果请求> 1,上面的单元测试将失败)。
为了完成这项工作,我必须将 MVCIntegration 包安装到我的单元测试项目中(哎哟)
PM> install-package RavenDB.Client.MvcIntegration
我还必须添加对 System.Web 的引用,这让我不寒而栗。我认为这行不通。
然后我将适当的初始化添加到我的 Fake db 提供程序中,如下所示:
public class InMemoryRavenSessionProvider : IRavenSessionProvider
{
private static IDocumentStore documentStore;
public static IDocumentStore DocumentStore { get { return (documentStore ?? (documentStore = CreateDocumentStore())); } }
private static IDocumentStore CreateDocumentStore()
{
var store = new EmbeddableDocumentStore { RunInMemory = true};
store.Initialize();
store.Conventions.IdentityPartsSeparator = "-";
RavenProfiler.InitializeFor(store); //<-- Here is the Profiler line
return store;
}
public IDocumentSession GetSession()
{
return DocumentStore.OpenSession();
}
}
最后,我尝试在单元测试结束时从 RavenProfiler 检索某种值:
var requests = RavenProfiler.CurrentRequestSessions();
这没有用!它在 RavenProfiler 中失败了,因为 HttpContext 为空——这就是我对 System.Web 的预感。那好吧。
那么,如何计算对我的 RavenDB 实例发出的请求数?这是否可以在不需要 MVC 或 System.Web 的情况下完成,因此可以轻松地将其固定到单元测试中?
谢谢