Области вложенности транзакций для интеграционных тестов с использованием Rhino Commons UnitOfWork - PullRequest
0 голосов
/ 22 марта 2009

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

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

Я использую 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 s получаю следующую ошибку:

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

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

Спасибо.

1 Ответ

0 голосов
/ 16 июня 2009

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

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

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

...