2010-06-09 7 views
3

Je ne sais pas très bien comment gérer les sessions au sein de mes appareils de test nunit.Comment gérer les sessions dans les tests unitaires NHibernate?

Dans le test suivant, je suis en train de tester un référentiel. Mon constructeur de référentiel reçoit un ISession (puisque je vais utiliser la session par requête dans mon application web).

Dans mon installation de test, je configure NHibernate et construit la fabrique de sessions. Dans ma configuration de test, je crée une base de données SQLite propre pour chaque test exécuté.

[TestFixture] 
public class SimpleRepository_Fixture 
{ 
    private static ISessionFactory _sessionFactory; 
    private static Configuration _configuration; 

    [TestFixtureSetUp] // called before any tests in fixture are executed 
    public void TestFixtureSetUp() { 
     _configuration = new Configuration(); 
     _configuration.Configure(); 
     _configuration.AddAssembly(typeof(SimpleObject).Assembly); 
     _sessionFactory = _configuration.BuildSessionFactory(); 
    } 

    [SetUp] // called before each test method is called 
    public void SetupContext() { 
     new SchemaExport(_configuration).Execute(true, true, false); 
    } 

    [Test] 
    public void Can_add_new_simpleobject() 
    { 
     var simpleObject = new SimpleObject() { Name = "Object 1" }; 

     using (var session = _sessionFactory.OpenSession()) 
     { 
      var repo = new SimpleObjectRepository(session); 
      repo.Save(simpleObject); 
     } 

     using (var session =_sessionFactory.OpenSession()) 
     { 
      var repo = new SimpleObjectRepository(session); 
      var fromDb = repo.GetById(simpleObject.Id); 

      Assert.IsNotNull(fromDb); 
      Assert.AreNotSame(simpleObject, fromDb); 
      Assert.AreEqual(simpleObject.Name, fromDb.Name); 
     } 
    } 
} 

Est-ce une bonne approche ou devrais-je gérer les sessions différemment?

+0

Techniquement, il pourrait être préférable de commencer par un état tout à fait propre à chaque test unitaire (nouvelle configuration avant chaque test), mais il prendra trop de temps pour exécuter beaucoup de tests sur de cette façon, J'utilise quelque chose de très similaire à votre version. – Paco

Répondre

1

Cela semble très bien, mais je voudrais créer comme une classe de base. Découvrez comment fonctionne Ayende.

http://ayende.com/Blog/archive/2009/04/28/nhibernate-unit-testing.aspx

+0

Dans cette classe de base, Ayende crée le db une fois pour toutes les tests. J'ai lu qu'il est préférable de le faire une fois par test. Est-ce encore possible à travers la classe de base? –

+0

Je viens d'implémenter cette classe de base et c'est vraiment très bien. Certainement recommandé. –

Questions connexes