2009-05-26 186 views
0

我正在为我的流利映射实体构建一些基本的crud方法。测试NHibernate的实体映射

我只是想知道是否有一个简单的方法来使事务执行回滚时,我运行的CUD测试方法?

代码被测试执行内部

这里提交的是一个创建示例:

public int? Create(IIdentifiable entity) 
    { 
     int? newId = null; 
     using (ISession session = SessionFactoryProvider.NewSession) 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      object newObj = session.Save(entity); 
      newId = (int?)newObj; 
      transaction.Commit(); 
     } 

     return (int?)newId; 
    } 

回答

2

如果您使用xUnit.net,那么contrib项目中会有一个AutoRollback属性。如果您打算使用System.Transactions,那么您可以在session.Open()和session应该自动列表之前创建一个新事务(除非您已将ado.net设置为不自动列表)。然后在最后放弃。

我做了一个类似的(长)的东西,而前:

public class TransactionalTest 
{ 
    public TransactionalTest() 
    { 
     Transaction.Current = new CommittableTransaction(); 
    } 

    ~TransactionalTest() 
    { 
     if (Transaction.Current != null && 
      Transaction.Current.TransactionInformation.Status != 
      TransactionStatus.Committed) 
     { 
      Transaction.Current.Rollback(); 
     } 
    } 
} 

然后,只需有您的测试延长TransactionalTest。但是,我认为NUnit,MbUnit和xUnit.net都支持开箱或用contrib项目进行交易测试。

0

嗯,我不认为这是一个好主意,让你的方法创建一个会话并执行事务处理....除非该方法也是服务边界。

假设您想在同一个事务中创建多个实体,那么您将如何处理?

+0

它的服务边界,没有MULTY实体创建 – 2009-05-26 16:56:13

0

对于集成测试,我使用会话修饰器来自动提交和驱逐实体。你能适应它为您的情况:

public class AutoCommitAndEvictSession : SessionDecorator { 

    public AutoCommitAndEvictSession(ISession session) 
     : base(session) { } 

    public override object Save(object obj) { 
     object result; 
     using (var tx = Session.BeginTransaction()) { 
      result = Session.Save(obj); 
      tx.Commit(); 
     } 
     Session.Evict(obj); 
     return result; 
    } 

    public override void Update(object obj) { 
     CommitAndEvict(base.Update, obj); 
    } 

    public override void Delete(object obj) { 
     CommitAndEvict(base.Delete, obj); 
    } 

    private void CommitAndEvict(Action<object> action, object entity) { 
     using (var tx = Session.BeginTransaction()) { 
      action.Invoke(entity); 
      tx.Commit(); 
     } 
     Session.Evict(entity); 
    } 
} 

你可以找到详细的用法举例这里: http://www.agileatwork.com/integration-testing-with-nhibernate/