2009-05-26 9 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()およびセッションがautoenlistする前に新しいトランザクションを作成できます(ado.netをautoenlistに設定しない限り)。最後に放棄してください。

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

うーん、私はあなたの方法でセッションを作成できるようにする良いアイデアであるとは思いませんそのメソッドがサービスの境界でない限り、トランザクション処理を実行します。

複数のエンティティを1つのトランザクションで作成したいとしますが、どのように処理するのですか?

+0

のをサービス境界、無マルティエンティティの作成 –

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/