2009-03-21 2 views
0

Я пытаюсь настроить класс интеграции, который обертывает каждый тест в транзакции. Таким образом, я могу отменить транзакцию после каждого теста вместо сброса базы данных перед каждым тестом.Вложенные транзакции для интеграционных тестов с использованием Rhino Commons UnitOfWork

Я также хочу, чтобы иметь возможность использовать транзакции в самих тестах интеграции.

Я использую NHibernate и Rhino Commons UnitOfWork для проекта. Я использую 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. Я не совсем понимаю поведение сессий с вложенными Rhino Commons UnitOfWork s. То, что у меня здесь, не отменяет изменения из теста интеграции.

Я попытался с помощью TransactionScope из System.Transactions, но получить следующее сообщение об ошибке, когда UnitOfWork сек конец:

System.InvalidOperationException: Отключить нельзя назвать в то время как транзакция выполняется ..

Итак, вот мои вопросы:
Есть ли способ получить это поведение с UnitOfWork в Rhino Commons? Если нет, должен ли я просто сбросить базу данных перед каждым тестом или есть другой способ развернуть транзакции, которые прекрасно сочетаются с UnitOfWork?

спасибо.

ответ

0

Я считаю, UnitOfWork.Start().BeginTransaction() возвращает RhinoTransaction. Таким образом, чтобы сделать его более ясным, вы можете попытаться переписать код, как это:

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

Будьте осторожны, хотя, я не пробовал код, приведенный выше, дайте мне знать, если он работает.

Смежные вопросы