0

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

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

我正在为该项目使用 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 CommonsUnitOfWork的会话行为。我在这里所拥有的不会回滚集成测试中的更改。

我尝试使用TransactionScopefrom ,但在s 结束System.Transactions时出现以下错误:UnitOfWork

System.InvalidOperationException:事务正在进行时无法调用断开连接。

所以这是我的问题:
有没有办法在 Rhino Commons 中使用 UnitOfWork 获得这种行为?如果不是,我应该在每次测试之前重置数据库,还是有另一种方法可以嵌套与 UnitOfWork 配合得很好的事务?

谢谢你。

4

1 回答 1

0

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

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

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

于 2009-06-16T16:33:19.853 回答