2009-03-21 7 views
0

Ich versuche eine Integrationstestklasse einzurichten, die jeden Test in einer Transaktion umschließt. Auf diese Weise kann ich die Transaktion nach jedem Test zurücksetzen, anstatt die Datenbank vor jedem Test zurückzusetzen.Verschachteln von Transaktionsbereichen für Integrationstests mit Rhino Commons UnitOfWork

Ich möchte auch Transaktionen in den Integrationstests selbst verwenden können.

Ich verwende NHibernate und die Rhino Commons UnitOfWork für das Projekt. Ich verwende MSTest für die Tests.

Ich möchte etwas wie folgt aus:

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

Dies ist das erste Mal, dass ich verwendet habe NHibernate, Rhino Commons und MSTest. Ich bin nicht klar über das Verhalten von Sitzungen mit verschachtelten Rhino Commons UnitOfWork s. Was ich hier habe, rollt die Änderungen aus dem Integrationstest nicht zurück.

Ich versuchte TransactionScope von System.Transactions verwenden, aber die folgende Fehlermeldung erhalten, wenn die UnitOfWork s Ende:

System.InvalidOperationException: Trennen kann nicht aufgerufen werden, während eine Transaktion im Gange ist ..

Also hier sind meine Fragen:
Gibt es eine Möglichkeit, dieses Verhalten mit UnitOfWork in Rhino Commons zu bekommen? Wenn nicht, sollte ich die Datenbank vor jedem Test zurücksetzen oder gibt es eine andere Möglichkeit, Transaktionen zu verschachteln, die gut mit UnitOfWork funktionieren?

Vielen Dank.

Antwort

0

Ich glaube, UnitOfWork.Start().BeginTransaction() gibt eine RhinoTransaction zurück. So machen es klar, können Sie versuchen, den Code, da dies zu umschreiben:

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

Seien Sie gewarnt, ich nicht den Code oben versucht haben, lassen Sie mich wissen, ob es funktioniert.

Verwandte Themen