0

各テストをトランザクションでラップする統合テストクラスを設定しようとしています。このようにして、各テストの前にDBをリセットする代わりに、各テストの後にトランザクションをロールバックできます。

また、統合テスト自体でトランザクションを使用できるようにしたいと思います。

プロジェクトにはNHibernateとRhinoCommonsUnitOfWorkを使用しています。テストにはMSTestを使用しています。

私はこのようなものが欲しい:

[TestInitialize]
public void TestInit() {
    // create outer transaction scope
    UnitOfWork.Start();
    UnitOfWork.Current.BeginTransaction();
}

[TestCleanup]
public void TestCleanup() {
    // rollback outer transaction
    UnitOfWork.Current.Dispose();
}

[TestMethod]
public void IntegrationTest() {
    using (UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork)) {
        UnitOfWork.Current.BeginTransaction();

        // integration test code

        UnitOfWork.Current.TransactionalFlush();

        // possibly more transactions
    }
}

NHibernate、Rhino Commons、MSTestを使用したのはこれが初めてです。ネストされたRhinoCommonsを使用したセッションの動作がわかりませんUnitOfWork。私がここに持っているのは、統合テストからの変更をロールバックしません。

TransactionScopefromを使用してみましたが、 sが終了System.Transactionsすると次のエラーが発生します。UnitOfWork

System.InvalidOperationException:トランザクションの進行中は切断を呼び出すことができません。

だからここに私の質問があります:
Rhino CommonsのUnitOfWorkでこの動作を取得する方法はありますか?そうでない場合は、各テストの前にデータベースをリセットする必要がありますか、それともUnitOfWorkでうまく機能するトランザクションをネストする別の方法がありますか?

ありがとうございました。

4

1 に答える 1

0

UnitOfWork.Start().BeginTransaction()返すと思いますRhinoTransaction。したがって、より明確にするために、コードを次のように書き直すことができます。

using(IUnitOfWork uow = UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork))
{
    RhinoTransaction tx = uow.BeginTransaction();
    .
    .
    .
    .
    tx.Rollback();
}

ただし、上記のコードは試していません。動作するかどうかをお知らせください。

于 2009-06-16T16:33:19.853 に答える