Trabajando en un servidor C # con SQL Server y PetaPoco , este es el enfoque que tomamos para limpiar los datos en las pruebas unitarias.
Una prueba unitaria típica tendría la configuración y el desmontaje de la siguiente manera:
[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();
}
// ...
}
Donde PlatformDataObject es una clase responsable de comunicarse con la base de datos, por ejemplo, realizar Seleccionar Insertar Actualizar Eliminar. Todos los tipos de * DataObject heredan ServerDataObject: la clase base tiene métodos para abortar, revertir o confirmar la transacción.
/// <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();
}
}
Todas las pruebas unitarias llamarían RollbackTransaction (), finalmente llamarían IDbTransaction.Rollback ().
En las pruebas, encontramos que era una rutina crear una nueva instancia de un * DataObject, crear algunas filas usando instrucciones Insertar, realizar pruebas en ellas (selecciones, actualizaciones, etc.) y luego revertir.
Podemos configurar un conjunto de datos de prueba antes de que todas las pruebas se ejecuten utilizando un SetUpFixture , una clase que se ejecuta una vez antes de que se ejecuten todas las pruebas, y eliminar / deshacer los datos en desmontaje después de que se ejecuten todas las pruebas.