[英]testing entity mapping of NHibernate
我正在為流利的實體繪制一些基本的粗略方法。
我只是想知道在運行cud測試方法時是否有一種簡單的方法可以使事務執行回滾?
被測試的代碼在內部執行提交
這是一個創建示例:
public int? Create(IIdentifiable entity)
{
int? newId = null;
using (ISession session = SessionFactoryProvider.NewSession)
using (ITransaction transaction = session.BeginTransaction())
{
object newObj = session.Save(entity);
newId = (int?)newObj;
transaction.Commit();
}
return (int?)newId;
}
如果您使用的是xUnit.net,則contrib項目中有一個AutoRollback屬性。 如果您願意使用System.Transactions,則可以在session.Open()和session應該自動注冊之前創建一個新事務(除非您將ado.net設置為不自動注冊)。 然后在最后放棄。
前一段時間,我做了類似的事情:
public class TransactionalTest
{
public TransactionalTest()
{
Transaction.Current = new CommittableTransaction();
}
~TransactionalTest()
{
if (Transaction.Current != null &&
Transaction.Current.TransactionInformation.Status !=
TransactionStatus.Committed)
{
Transaction.Current.Rollback();
}
}
}
然后,讓您的測試擴展TransactionalTest。 但是,我認為NUnit,MbUnit和xUnit.net都支持開箱即用或使用contrib項目進行事務性測試。
檢查FUBUMVC Contrib是否有出色的NHibernate CRUD測試方法。
對於集成測試,我使用會話裝飾器自動提交並逐出實體。 您可以根據情況進行調整:
public class AutoCommitAndEvictSession : SessionDecorator {
public AutoCommitAndEvictSession(ISession session)
: base(session) { }
public override object Save(object obj) {
object result;
using (var tx = Session.BeginTransaction()) {
result = Session.Save(obj);
tx.Commit();
}
Session.Evict(obj);
return result;
}
public override void Update(object obj) {
CommitAndEvict(base.Update, obj);
}
public override void Delete(object obj) {
CommitAndEvict(base.Delete, obj);
}
private void CommitAndEvict(Action<object> action, object entity) {
using (var tx = Session.BeginTransaction()) {
action.Invoke(entity);
tx.Commit();
}
Session.Evict(entity);
}
}
您可以在以下示例中找到有關用法的更多詳細信息: http : //www.agileatwork.com/integration-testing-with-nhibernate/
嗯,我認為讓您的方法創建一個會話並執行事務處理不是一個好主意...。除非該方法也是服務邊界。
假設您要在一個事務中創建多個實體,那么您將如何處理呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.