使用Rhino Commons UnitOfWork嵌套事务范围以进行集成测试

时间:2009-03-21 23:52:35

标签: nhibernate transactionscope unit-of-work rhino-commons

我正在尝试设置一个集成测试类,它在事务中包装每个测试。这样我就可以在每次测试后回滚事务,而不是在每次测试之前重置数据库。

我还希望能够在集成测试中使用事务。

我正在使用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很好地结合的事务?

谢谢。

1 个答案:

答案 0 :(得分:0)

我相信UnitOfWork.Start().BeginTransaction()会返回RhinoTransaction。因此,为了更清楚,您可以尝试重写代码:

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

请注意,我没有尝试过上面的代码,请告诉我它是否有效。