2009-03-21 2 views
0

J'essaie de configurer une classe de test d'intégration qui enveloppe chaque test dans une transaction. De cette façon, je peux annuler la transaction après chaque test au lieu de réinitialiser la base de données avant chaque test.Imbrication des portées de transaction pour les tests d'intégration à l'aide de Rhino Commons UnitOfWork

Je souhaite également pouvoir utiliser les transactions dans les tests d'intégration eux-mêmes. J'utilise NHibernate et le Rhino Commons UnitOfWork pour le projet. J'utilise MSTest pour les tests.

Je veux quelque chose comme ceci:

[TestInitialize] 
public void TestInit() { 
    // create outer transaction scope 
    UnitOfWork.Start(); 
    UnitOfWork.Current.BeginTransaction(); 
} 

[TestCleanup] 
public void TestCleanup() { 
    // rollback outer transaction 
    UnitOfWork.Current.Dispose(); 
} 

[TestMethod] 
public void IntegrationTest() { 
    using (UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork)) { 
     UnitOfWork.Current.BeginTransaction(); 

     // integration test code 

     UnitOfWork.Current.TransactionalFlush(); 

     // possibly more transactions 
    } 
} 

C'est la première fois que je l'ai utilisé NHibernate, Rhino Commons et MSTest. Je ne suis pas clair sur le comportement des sessions avec Rhino Commons imbriqués UnitOfWork s. Ce que j'ai ici ne supprime pas les modifications du test d'intégration.

J'ai essayé d'utiliser TransactionScope de System.Transactions, mais l'erreur suivante lorsque la fin de la UnitOfWork:

System.InvalidOperationException: Disconnect ne peut pas être appelé alors qu'une transaction est en cours ..

Voici donc mes questions:
Existe-t-il un moyen d'obtenir ce comportement avec UnitOfWork dans Rhino Commons? Si ce n'est pas le cas, dois-je simplement réinitialiser la base de données avant chaque test ou existe-t-il un autre moyen d'imbriquer des transactions qui fonctionne bien avec UnitOfWork?

Merci.

Répondre

0

Je crois que UnitOfWork.Start().BeginTransaction() renvoie un RhinoTransaction. Donc, pour le rendre plus clair, vous pouvez essayer de réécrire le code comme ceci:

using(IUnitOfWork uow = UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork)) 
{ 
    RhinoTransaction tx = uow.BeginTransaction(); 
    . 
    . 
    . 
    . 
    tx.Rollback(); 
} 

Attention cependant, je ne l'ai pas essayé le code ci-dessus, laissez-moi savoir si cela fonctionne.

Questions connexes