Области вложенности транзакций для интеграционных тестов с использованием 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 UnitOfWorks. То, что я имею здесь, не откатывает изменения от интеграционного теста.

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

System.InvalidOperationException: разъединение не может быть вызвано во время выполнения транзакции.

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

Спасибо.

1 ответ

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

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

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

Другие вопросы по тегам