【问题标题】:Nesting transaction scopes for integration tests using Rhino Commons UnitOfWork使用 Rhino Commons UnitOfWork 为集成测试嵌套事务范围
【发布时间】:2009-03-21 23:52:34
【问题描述】:

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

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

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

我尝试使用System.Transactions 中的TransactionScope,但是当UnitOfWorks 结束时出现以下错误:

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

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-21
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多