SQL ServerとPetaPocoを備えたC#サーバーで作業する場合、これは単体テストでデータをクリーンアップするために採用したアプローチです。
典型的な単体テストでは、次のようにセットアップとティアダウンがあります。
[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();
}
// ...
}
PlatformDataObjectは、データベースとの通信を担当するクラスです(例:Select Insert Update Deletesの実行)。すべての* DataObjectタイプはServerDataObjectを継承します。基本クラスには、トランザクションを中止、ロールバック、またはコミットするためのメソッドがあります。
/// <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();
}
}
すべてのユニットテストはRollbackTransaction()を呼び出し、最終的にはIDbTransaction.Rollback()を呼び出します。
テストでは、* DataObjectの新しいインスタンスを作成し、Insertステートメントを使用していくつかの行を作成し、それらに対してテスト(選択、更新など)を実行してからロールバックするルーチンが見つかりました。
SetUpFixtureを使用してすべてのテストを実行する前に、一連のテストデータをセットアップできます。クラスは、すべてのテストが実行される前に1回実行され、すべてのテストが実行された後にティアダウンでデータを削除またはロールバックします。