2012-04-23 6 views
1

私はNancyFX + RavenDBを使用しています。私は現在、AgendateRootからドメイン参照を構築するために、AyendeにDenormalized Referenceテクニックを推奨しようとしています。そのリンクを読むと、親インスタンスをロードして、RavenDBの 'Include'ステートメントを使って参照インスタンスをプリフェッチすることであることが分かります。RavenDB:UnitTestsでRavenProfilerを使用するにはどうすればよいですか?

私はこれをすべて実行しているように見えますが、単体テストで、参照されたインスタンスが実際にプリフェッチされているかどうかを判断するのは苦労しています。ここで説明する私のユニットテストからの抜粋である:

[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); 
} 

私は偽DB(メモリ内のAN、RavenDBの埋め込みインスタンス)から自分のインスタンスをロードすることができるが、そうでないチェック上記単位テストそれらがプリフェッチされているかどうかを確認してください。

おそらく私はRavenProfilerを使うことができると考えました。おそらく、これは私が次にアサートすることができるdb要求の数を数えます(例えば> 1の要求の場合、上記のユニットテストは失敗します)。私は私のユニットテストプロジェクト(痛い)

PM> install-package RavenDB.Client.MvcIntegration 

にMVCIntegrationパッケージをインストールする必要がありました。この作品を作るために

私はまた、私は震えるなさのSystem.Webへの参照を追加する必要がありました。私はこれがうまくいくとは思わない。

私は、このように、私のフェイク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を必要とせずにこれを行うことができるので、簡単に単体テストにすることができますか?

おかげ

答えて

3

あなたはこのために、次のコードを使用することができます。

session.Advanced.NumberOfRequests 

RavenDBプロファイラは、埋め込まれた文書ストアに対して実行されません。

また、Ravenソースの単体テストであるthey test this scenarioを見ることができます。

+0

よろしく!すごい:)それは本当にkewl忍者の秘密のトリックだ! –

+0

パーフェクト。それは治療に効果があった。ありがとう。 – biofractal

+1

最終的な注意:このテクニックを使用する場合は、dbの各呼び出しが要求としてカウントされることに注意してください。したがって、上記の例では、実際の要求数は4になります。最初の3つの要求はさまざまな偽のオブジェクトを保存するためのもので、最後の単一の要求は3つのインスタンスをすべて一度に取り戻すフェッチです。良いニュースは、RavenDBのプリフェッチはうまく動作します:-) – biofractal