簡體   English   中英

NHibernate的測試實體映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM