2015-08-31 18 views
7

traggo da questa classe di base al fine di racchiudere ogni prova indivdual in una transazione che annullanidificati TransactionScope per NUnit TestFixure e SetUp

public abstract class TransactionBackedTest 
{ 
    private TransactionScope _transactionScope; 

    [SetUp] 
    public void TransactionSetUp() 
    { 
     var transactionOptions = new TransactionOptions 
     { 
      IsolationLevel = IsolationLevel.ReadCommitted, 
      Timeout = TransactionManager.MaximumTimeout 
     }; 

     _transactionScope = new TransactionScope(TransactionScopeOption.Required, 
               transactionOptions); 
    } 

    [TearDown] 
    public void TransactionTearDown() 
    { 
     _transactionScope.Dispose(); 
    } 
} 

Utilizzando questo ho anche provato per impostare una transazione TestFixure stesso modo :

[TestFixture] 
class Example: TransactionBackedTest 
{ 

    private TransactionScope _transactionScopeFixure; 


    [TestFixtureSetUp] 
    public void Init() 
    { 
     var transactionOptions = new TransactionOptions 
     { 
      IsolationLevel = IsolationLevel.ReadCommitted, 
      Timeout = TransactionManager.MaximumTimeout 
     }; 

     _transactionScopeFixure = new TransactionScope(TransactionScopeOption.Required, 
                 transactionOptions); 


     SetupAllDataForAllTest(); 
    } 

    [TestFixtureTearDown] 
    public void FixtureTearDown() 
    { 
     _transactionScopeFixure.Dispose(); 
    } 


    public void SetupAllDataForAllTest() 
    { 
     // Sql stuff here that will get undone from the TestFixtureTearDown scope dispose 
    } 


    [Test] 
    public void DoSqlStuff1() 
    { 
     // Sql stuff here that will get undone from the TransactionBackedTest 
    } 

    [Test] 
    public void DoSqlStuff2() 
    { 
     // Sql stuff here that will get undone from the TransactionBackedTest 
    } 
} 

l'idea è che SetupAllDataForAllTest si correva una volta all'inizio e inserisce tutti i dati di base che i test si basano su. Questi dati di base devono essere cancellati/rolledback una volta che i test sono completi.

Desidero anche che ogni test sia isolato in modo che non possano interferire tra loro.

Il problema che sto avendo ora è che dopo il primo test, afferma che la transazione TestFixture è stata chiusa, anche se volevo solo chiudere la transazione di SetUp. La mia ipotesi è che se si esegue Dispose() e la transazione interna si espone l'esterno, quindi non sono sicuro di come realizzare ciò che voglio fare

+0

Per motivi di curiosità, perché dovresti inserire i test nell'ambito di una transazione e ripristinarlo? Stai testando alcune chiamate al database ma non vuoi che i dati vengano commessi? – Ruskin

+0

Sto testando le chiamate che fanno unire come parte di un processo, ma sì, non voglio che l'unione venga eseguita. Il test complessivo ha una propria transazione perché i dati di test sono precaricati. Quindi, nella transazione 1, vengono inseriti i dati del test, quindi per ogni test potrebbe verificarsi un'unione che non dovrebbe essere eseguita (i dati del test devono essere ripristinati) – LearningJrDev

risposta

3

Non hai detto quale database si utilizza.

In MS SQL Server se si esegue BEGIN TRANSACTION all'interno di un'altra transazione (rendendole nidificate) e quindi ROLLBACK TRANSACTION all'interno della transazione nidificata, verrà eseguito il rollback di tutto (anche l'intera transazione esterna).

ROLLBACK TRANSACTION senza un savepoint_name o transaction_name torna all'inizio della transazione. Quando si annidano le transazioni , questa stessa istruzione riporta tutte le transazioni interne a l'istruzione BEGIN TRANSACTION più esterna.

Per poter eseguire il rollback solo della transazione nidificata interna, è necessario avviarlo con SAVE TRANSACTION <name> con un nome per la transazione nidificata. Quindi puoi ROLLBACK <name> per ripristinare solo la parte annidata.

Se si utilizza un altro database, potrebbe comportarsi in modo diverso nelle transazioni nidificate.

Non ho idea di come rendere corretto il problema delle classi BEGIN or SAVE TRANSACTION istruzioni SQL a seconda che la transazione sia nidificata o meno.

+0

Sì SQL Server. Approfondirò questo, grazie – LearningJrDev

+0

Questo è davvero vero :) Ho creduto per molti anni che avrei potuto effettivamente nidificare le transazioni con MS-SQL. Ero così sbagliato. – Frode