Trabalhando em um servidor C # com SQL Server e PetaPoco , essa é a abordagem que adotamos para limpar dados em testes de unidade.
Um teste de unidade típico teria Setup e Teardown da seguinte maneira:
[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();
}
// ...
}
Onde PlatformDataObject é uma classe responsável pela comunicação com o banco de dados, por exemplo, executando Select Insert Update Deletes. Todos os tipos * DataObject herdam ServerDataObject - a classe base possui métodos para interromper, reverter ou confirmar a transação.
/// <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();
}
}
Todos os testes de unidade chamariam RollbackTransaction () e, finalmente, chamariam IDbTransaction.Rollback ().
Nos testes, achamos rotineiro criar uma nova instância de um * DataObject, criar algumas linhas usando instruções Insert, executar testes nelas (Selects, Updates etc ...) e depois reverter.
Podemos configurar um conjunto de dados de teste antes de todos os testes serem executados usando um SetUpFixture - uma classe executada uma vez antes de todos os testes serem executados e excluir / reverter os dados em desmontagem após a execução de todos os testes.