2010-01-21 5 views
1

J'ai une classe de référentiel qui utilise une session NHibernate pour conserver des objets dans la base de données. Par défaut, le référentiel n'utilise pas une transaction explicite - c'est à l'appelant de gérer. J'ai le test de l'unité suivante pour tester ma plomberie NHibernate:NHibernate - Vider avant d'interroger?

[Test] 
public void NHibernate_BaseRepositoryProvidesRequiredMethods() 
{    
    using (var unitOfWork = UnitOfWork.Create()) 
    { 
     // test the add method 
     TestRepo.Add(new TestObject() { Id = 1, Name = "Testerson" }); 
     TestRepo.Add(new TestObject() { Id = 2, Name = "Testerson2" }); 
     TestRepo.Add(new TestObject() { Id = 3, Name = "Testerson3" }); 

     // test the getall method 
     var objects = TestRepo.GetAll(); 
     Assert.AreEqual(3, objects.Length); 

     // test the remove method 
     TestRepo.Remove(objects[1]); 
     objects = TestRepo.GetAll(); 
     Assert.AreEqual(2, objects.Length); 

     // test the get method 
     var obj = TestRepo.Get(objects[1].Id); 
     Assert.AreSame(objects[1], obj); 
    } 
} 

Le problème est que la ligne

Assert.AreEqual(3, objects.Length); 

échoue au test car la liste d'objet retourné par la méthode GetAll est vide. Si je vider manuellement la session juste après l'insertion des trois objets, cette partie du test passe. J'utilise le FlushMode par défaut sur la session, et selon la documentation, il est supposé vider avant d'exécuter la requête pour récupérer tous les objets, mais ce n'est évidemment pas le cas. Qu'est-ce qui me manque? Edit: J'utilise Sqlite pour le scénario de test unitaire, si cela fait une différence.

Répondre

3

état Vous qui

selon la documentation, il est censé rincer avant d'exécuter la requête pour récupérer tous les objets

Mais la doc à https://www.hibernate.org/hib_docs/v3/api/org/hibernate/FlushMode.html, les états doc que dans flush AUTO le mode (l'accent est le mien):

La session est parfois rincé avant l'exécution de la requête afin de s'assurer que les requêtes ne renvoient jamais l'état périmé. C'est le mode de vidage par défaut.

Alors oui, vous devez faire un vidage pour enregistrer ces valeurs avant de les attendre dans votre sélection.