Lavorando su un server C # con SQL Server e PetaPoco , questo è l'approccio che abbiamo adottato per ripulire i dati nell'unità test.
Un test unitario tipico avrebbe Setup e Teardown come segue:
[TestFixture]
internal class PlatformDataObjectTests
{
private IDatabaseConfiguration _dbConfig;
private Database _pocoDatabase;
private PlatformDataObject _platformDto;
[SetUp]
public void Setup()
{
_dbConfig = new CommonTestsAppConfig().GetDatabaseConfiguration();
_pocoDatabase = new Database(_dbConfig.ConnectionString, SqlClientFactory.Instance);
_platformDto = new PlatformDataObject(_pocoDatabase);
_platformDto.BeginTransaction();
}
[TearDown]
public void TearDown()
{
Console.WriteLine("Last Sql: {0}", _pocoDatabase.LastCommand);
_platformDto.RollbackTransaction();
_platformDto.Dispose();
}
// ...
}
Dove PlatformDataObject è una classe responsabile della comunicazione con il database, ad es. eseguendo Seleziona Inserisci Elimina aggiornamenti. Tutti i tipi * DataObject ereditano ServerDataObject - la classe base ha metodi per l'interruzione, il rollback o il commit della transazione.
/// <summary>
/// A Data-Transfer Object which allows creation and querying of Platform types from the database
/// </summary>
[ExportType(typeof(IPlatformDataObject))]
public class PlatformDataObject : ServerDataObject, IPlatformDataObject
{
private static readonly ILog Log = LogManager.GetLogger(typeof (ProductDataObject));
private const string PlatformTable = "t_Platform";
public PlatformDataObject(IPocoDatabase pocoDatabase) : base(pocoDatabase)
{
}
...
}
/// <summary>
/// A base Data-Transfer Object type
/// </summary>
public abstract class ServerDataObject : IServerDataObject
{
protected const string Star = "*";
private readonly IPocoDatabase _pocoDatabase;
public ServerDataObject(IPocoDatabase pocoDatabase)
{
_pocoDatabase = pocoDatabase;
}
public string LastCommand
{
get { return PocoDatabase.LastCommand; }
}
public IPocoDatabase PocoDatabase
{
get { return _pocoDatabase; }
}
public int TransactionDepth
{
get { return _pocoDatabase.TransactionDepth; }
}
public bool TransactionAborted { get; private set; }
public void BeginTransaction()
{
_pocoDatabase.BeginTransaction();
}
public void AbortTransaction()
{
_pocoDatabase.AbortTransaction();
}
public void RollbackTransaction()
{
TransactionAborted = true;
}
public virtual void Dispose()
{
if (TransactionAborted)
_pocoDatabase.AbortTransaction();
else
_pocoDatabase.CompleteTransaction();
}
}
Tutti i test unitari chiamerebbero RollbackTransaction (), in definitiva chiamerebbero IDbTransaction.Rollback ().
Nei test abbiamo trovato che routine creare una nuova istanza di * DataObject, creare alcune righe usando le istruzioni Insert, eseguire test su di esse (Seleziona, Aggiorna ecc.) e quindi eseguire il rollback.
Potremmo impostare una serie di dati di test prima di eseguire tutti i test utilizzando un SetUpFixture - una classe viene eseguita una volta prima dell'esecuzione di tutti i test ed elimina / ripristina i dati in teardown dopo l'esecuzione di tutti i test.