1

我正在使用 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 的情况下完成,因此可以轻松地将其固定到单元测试中?

谢谢

4

1 回答 1

3

您可以为此使用以下代码:

session.Advanced.NumberOfRequests

RavenDB 分析器不会针对嵌入式文档存储运行。

你也可以看看 Raven 源代码中的单元测试,他们测试这个场景

于 2012-04-23T16:51:45.777 回答