2012-04-23 5 views
1

J'utilise NancyFX + RavenDB. J'essaye actuellement d'implémenter la technique Denormalized Reference recommandée par Ayende pour créer des références de domaine à partir d'un AggregateRoot. Si vous lisez ce lien, vous pouvez voir que l'astuce consiste à charger l'instance parent puis extraire les instances référencées à l'aide de l'instruction 'Include' de RavenDB. J'ai fait tout cela et cela semble fonctionner mais j'ai du mal à déterminer, via un test unitaire, si les instances référencées sont réellement pré-récupérées. Voici un extrait de mon unité-test pour illustrer:RavenDB: Comment utiliser RavenProfiler dans mes UnitTests?

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

Le test unitaire ci-dessus vérifie que je peux charger mes instances de mon faux db (son un en mémoire, par exemple intégré de RavenDB) mais il n'a pas vérifiez s'ils sont pré-récupérés.

Je pensais que je pourrais peut-être utiliser le RavenProfiler. Peut-être que cela compterait le nombre de requêtes db auxquelles je pourrais alors m'opposer (le test d'unité ci-dessus échouerait si les requêtes> 1 par exemple).

Pour faire ce travail, je devais installer le paquet MVCIntegration à mon projet de test d'unité (aïe)

PM> install-package RavenDB.Client.MvcIntegration 

Je devais aussi ajouter une référence à System.Web, ce qui m'a fait frissonner. Je ne pense pas que ça va marcher.

J'ai ensuite ajouté l'initialisation appropriée à mon fournisseur faux db, comme ceci:

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

Enfin j'ai essayé de récupérer une valeur de quelque sorte de la RavenProfiler à la fin de mon unité de test:

var requests = RavenProfiler.CurrentRequestSessions(); 

Cela n'a pas fonctionné! Il a échoué dans le RavenProfiler parce que le HttpContext était null - ce qui était ce que mon prémonition sur le System.Web devait être. Tant pis. Alors, comment compter le nombre de requêtes effectuées sur mon instance RavenDB? Et cela peut-il être fait sans nécessiter MVC ou System.Web afin qu'il puisse facilement être assemblé en tests unitaires?

Merci

Répondre

3

Vous pouvez utiliser le code suivant pour cela:

session.Advanced.NumberOfRequests 

Le profileur RavenDB ne fonctionnera pas contre un magasin de documents intégré.

Vous pouvez également jeter un oeil aux tests unitaires dans la source Raven, they test this scenario.

+0

oh wow! génial :) c'est un truc secret vraiment kewl ninja! –

+0

Parfait. Cela a fonctionné un régal. Merci. – biofractal

+1

Note finale: Si vous utilisez cette technique, souvenez-vous que chaque appel à la base de données compte comme une requête, donc pour mon exemple ci-dessus, le nombre réel de demandes serait de quatre. Les trois premières requêtes concernent l'enregistrement des différents faux objets et la requête finale, unique, est l'extraction qui récupère les trois instances en une fois. La bonne nouvelle est que le pré-chargement dans RavenDB fonctionne très bien :-) – biofractal

Questions connexes