2009-05-26 119 views
0

我正在爲我的流利映射實體構建一些基本的crud方法。測試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; 
    } 

回答

2

如果您使用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項目進行交易測試。

0

嗯,我不認爲這是一個好主意,讓你的方法創建一個會話並執行事務處理....除非該方法也是服務邊界。

假設您想在同一個事務中創建多個實體,那麼您將如何處理?

+0

它的服務邊界,沒有MULTY實體創建 – 2009-05-26 16:56:13

0

對於集成測試,我使用會話修飾器來自動提交和驅逐實體。你能適應它爲您的情況:

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/