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