Unit testing NHibernate的测试实体映射

Unit testing NHibernate的测试实体映射,unit-testing,nhibernate,Unit Testing,Nhibernate,我正在为我流畅映射的实体构建一些基本的crud方法 我只是想知道,当我运行cud测试方法时,是否有一种简单的方法使事务执行回滚 正在测试的代码在内部执行提交 下面是一个创建示例: public int? Create(IIdentifiable entity) { int? newId = null; using (ISession session = SessionFactoryProvider.NewSession) using (I

我正在为我流畅映射的实体构建一些基本的crud方法

我只是想知道,当我运行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;
    }

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


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

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


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

检查一个好的NHibernate CRUD测试方法。

检查一个好的NHibernate CRUD测试方法。

如果您使用的是xUnit.net,contrib项目中有一个自动回滚属性。如果您愿意使用System.Transactions,则可以在会话之前创建一个新事务。open()和会话应自动登记(除非您已将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项目。

如果您使用的是xUnit.net,contrib项目中有一个自动回滚属性。如果您愿意使用System.Transactions,则可以在会话之前创建一个新事务。open()和会话应自动登记(除非您已将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项目。

对于集成测试,我使用会话装饰器自动提交和退出实体。您可以根据自己的情况进行调整:

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);
    }
}
公共类自动提交会话:SessionDecorator{
公共自动提交会话(ISession会话)
:base(session){}
公共覆盖对象保存(对象对象){
客观结果;
使用(var tx=Session.BeginTransaction()){
结果=Session.Save(obj);
tx.Commit();
}
会议.驱逐(obj);
返回结果;
}
公共覆盖无效更新(对象obj){
提交和收回(base.Update,obj);
}
公共覆盖无效删除(对象obj){
committendexecute(base.Delete,obj);
}
私有void commitandexecute(操作、对象实体){
使用(var tx=Session.BeginTransaction()){
调用(实体);
tx.Commit();
}
会议.驱逐(实体);
}
}
您可以在以下示例中找到有关用法的更多详细信息:

对于集成测试,我使用会话装饰器自动提交和退出实体。您可以根据自己的情况进行调整:

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);
    }
}
公共类自动提交会话:SessionDecorator{
公共自动提交会话(ISession会话)
:base(session){}
公共覆盖对象保存(对象对象){
客观结果;
使用(var tx=Session.BeginTransaction()){
结果=Session.Save(obj);
tx.Commit();
}
会议.驱逐(obj);
返回结果;
}
公共覆盖无效更新(对象obj){
提交和收回(base.Update,obj);
}
公共覆盖无效删除(对象obj){
committendexecute(base.Delete,obj);
}
私有void commitandexecute(操作、对象实体){
使用(var tx=Session.BeginTransaction()){
调用(实体);
tx.Commit();
}
会议.驱逐(实体);
}
}
您可以在以下示例中找到有关用法的更多详细信息:

这是服务边界,没有多个实体创建这是服务边界,没有多个实体创建