NancyFX + RavenDB を使用しています。私は現在、Ayende が推奨する非正規化参照手法を実装して、AggregateRoot からドメイン参照を構築しようとしています。そのリンクを読むと、親インスタンスをロードしてから、RavenDB の「Include」ステートメントを使用して、参照されたインスタンスをプリフェッチすることが秘訣であることがわかります。
私はこれをすべて実行しましたが、動作しているように見えますが、参照されたインスタンスが実際にプリフェッチされているかどうかを単体テストで判断するのに苦労しています。説明するための単体テストのスニペットを次に示します。
[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 を使用できるのではないかと考えました。たぶん、これは私がアサートできるdbリクエストの数をカウントします(たとえば、リクエストが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();
これはうまくいきませんでした!HttpContext が null だったため、RavenProfiler 内で失敗しました。これが、System.Web に関する私の予感だったに違いありません。しかたがない。
では、RavenDB インスタンスに対して行われたリクエストの数をカウントするにはどうすればよいでしょうか? また、MVC や System.Web を必要とせずにこれを実行できるので、単体テストに簡単に組み込むことができますか?
ありがとう