我正在尝试设置一个集成测试类,它在事务中包装每个测试。这样我就可以在每次测试后回滚事务,而不是在每次测试之前重置数据库。
我还希望能够在集成测试中使用事务。
我正在使用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
的会话行为。我在这里没有回滚集成测试中的更改。
我尝试使用TransactionScope
中的System.Transactions
,但在UnitOfWork
结束时收到以下错误:
System.InvalidOperationException:在事务正在进行时无法调用Disconnect ..
所以这是我的问题:
有没有办法在Rhino Commons中使用UnitOfWork获得这种行为?如果没有,我应该在每次测试之前重置数据库,还是有另一种方法来嵌套与UnitOfWork很好地结合的事务?
谢谢。
答案 0 :(得分:0)
我相信UnitOfWork.Start().BeginTransaction()
会返回RhinoTransaction
。因此,为了更清楚,您可以尝试重写代码:
using(IUnitOfWork uow = UnitOfWork.Start(UnitOfWorkNestingOptions.CreateNewOrNestUnitOfWork))
{
RhinoTransaction tx = uow.BeginTransaction();
.
.
.
.
tx.Rollback();
}
请注意,我没有尝试过上面的代码,请告诉我它是否有效。