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