Làm việc trên Máy chủ C # với SQL Server và PetaPoco , đây là cách tiếp cận chúng tôi đã thực hiện để dọn sạch dữ liệu trong Bài kiểm tra đơn vị.
Một bài kiểm tra đơn vị điển hình sẽ có Cài đặt và Teardown như sau:
[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();
}
// ...
}
Trong đó PlatformDataObject là một lớp chịu trách nhiệm giao tiếp với cơ sở dữ liệu, ví dụ như thực hiện Chọn Chèn Cập nhật Xóa. Tất cả các loại * DataObject kế thừa ServerDataObject - lớp cơ sở có các phương thức để hủy bỏ, khôi phục hoặc thực hiện giao dịch.
/// <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();
}
}
Tất cả các bài kiểm tra đơn vị sẽ gọi RollbackTransaction (), cuối cùng sẽ gọi IDbTransaction.Rollback ().
Trong các thử nghiệm, chúng tôi thấy rằng thường xuyên tạo một phiên bản mới của * DataObject, tạo một số hàng bằng cách sử dụng các câu lệnh Chèn, thực hiện các thử nghiệm trên chúng (Chọn, Cập nhật, v.v.) và sau đó quay lại.
Chúng tôi có thể thiết lập một tập hợp dữ liệu thử nghiệm trước khi tất cả các thử nghiệm được chạy bằng SetUpFixture - một lớp chạy một lần trước khi tất cả các thử nghiệm được chạy và xóa / khôi phục dữ liệu sau khi tất cả các thử nghiệm được chạy.