Области вложенности транзакций для интеграционных тестов с использованием 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?
Спасибо.
1 ответ
Я верю UnitOfWork.Start().BeginTransaction()
возвращает RhinoTransaction
, Поэтому, чтобы сделать это более понятным, вы можете попробовать переписать код следующим образом:
using(IUnitOfWork uow = UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork))
{
RhinoTransaction tx = uow.BeginTransaction();
.
.
.
.
tx.Rollback();
}
Будьте осторожны, я не пробовал код выше, дайте мне знать, если он работает.