NHibernateUtil- Dao- Test

来源:互联网 发布:淘宝找不到换购 编辑:程序博客网 时间:2024/06/01 10:36

//============================================================
// Auto generated by CodeSmith, at:  2012/9/5 21:57:44
//============================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using log4net;
using NHibernate.Context;

namespace BMW.Core.Dao {
    public class NHibernateUtil {
        /// <summary>
        /// 全局唯一的SessionFactory
        /// </summary>
        public static readonly ISessionFactory SessionFactory;
       

        //静态块,初始化读取 Hibernate 配置
        static NHibernateUtil() {
            try {
                Configuration cfg = new Configuration();
                SessionFactory = cfg.Configure().BuildSessionFactory();
            }
            catch (Exception ex) {
                ILog logger = LogManager.GetLogger("NHibernateHelper Logger");
                if (logger.IsErrorEnabled)
                    logger.Error("NHibernate initialization failed.Exception:{0}",ex);
                throw;
            }
        }

        /// <summary>
        /// 绑定Session上下文管理,与current_session_context_class配置节相关,应在请求开始时执行
        /// </summary>
        public static void BindSession() {
            ISession session = SessionFactory.OpenSession(); ;
            CurrentSessionContext.Bind(session);
        }

        /// <summary>
        /// 解除Session上下文管理绑定,释放Session对象。与current_session_context_class配置节相关,应在请求结束时执行。
        /// </summary>
        public static void UnbindSession() {
            ISession session = CurrentSessionContext.Unbind(NHibernateUtil.SessionFactory);
            session.Dispose();
        }

        /// <summary>
        /// 获取当前上下文的Session
        /// </summary>
        public static ISession CurrentSession {
            get {
                return SessionFactory.GetCurrentSession();
            }
        }

        /// <summary>
        /// 在当前会话中开始事务Hibernate并返回事务对象,应用using释放
        /// </summary>
        public static ITransaction BeginTransaction() {
            return CurrentSession.BeginTransaction();
        }
    }
}

 

 

 

//============================================================
// Auto generated by CodeSmith, at:  2012/9/5 21:57:44
//============================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using System.Web;
using NHibernate.Context;
using log4net;

namespace BMW.Core.Dao {
    public class NHibernateDao<T, TKey> {

        public ISession Session {
            get {
                return NHibernateUtil.CurrentSession;
            }
        }

        public T Insert(T entity) {
            Session.Save(entity);
            return entity;
        }

        public T Update(T entity) {
            Session.Merge(entity);
            return entity;
        }

        public void Delete(T entity) {
            Session.Delete(entity);
        }

        public T FetchByKey(TKey key) {
            return Session.Get<T>(key);
        }

        public IList<T> GetAll() {
            return Session.CreateCriteria(typeof(T)).List<T>();
        }
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using BMW.Core.Dao;
using System.Transactions;

namespace BMW.Core.Test {

    [TestFixture]
    public class TestBase {
        [TestFixtureSetUp]
        public void TestFixtureSetUp() {
            NHibernateUtil.BindSession();
        }

        [TestFixtureTearDown]
        public void TestFixtureTearDown() {
            NHibernateUtil.UnbindSession();
        }

        //TransactionScope tx = null;

        //[SetUp]
        //public void SetUp() {
        //    tx = new TransactionScope();
        //}

        //[TearDown]
        //public void TearDown() {
        //    tx.Dispose();
        //}
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using BMW.Core.Biz;
using BMW.Core.Model;

namespace BMW.Core.Test
{
    [TestFixture]
    public class PositionBizTest:TestBase
    {
        private PositionBiz target = new PositionBiz();

        [TestCase]
        public void GetAllTest() {
            Assert.AreEqual(5, target.GetAll().Count);
        }

        [TestCase]
        public void FetchPositionByNameTest()
        {
            Assert.AreEqual(1, target.FetchPositionsByName("员工").Id);
        }

        [TestCase]
        public void FetchByKeyTest() {
            Assert.IsNotNull(target.FetchByKey(2));
        }

        [TestCase]
        public void AddTest() {
            Position p = new Position { Name = "员工" };
            //输入重复职位名字,应抛出异常
            Assert.Throws<BusinessException>(() => target.Add(p));
            //不存在则添加
            p = new Position { Name = "所长" };
            target.Add(p);
            Assert.AreEqual(6,target.GetAll().Count);
        }

        //产看当前职位ID是被外键使用,true为使用中,false未使用
        [TestCase]
        public void CheckPositionIsReferencedTest() {
            Assert.IsTrue(target.CheckPositionIsReferenced(1));
            Assert.IsFalse(target.CheckPositionIsReferenced(2));
        }

        [TestCase]
        public void UpdateTest() {
            //修改职位名称,如果修改的名称在表里面已经存在,则抛出异常
            Position p = target.FetchByKey(4);
            p.Name = "经理";
            Assert.Throws<BusinessException>(() => target.Update(p));
            //如果是唯一,则成功
            p.Name = "班长";
            target.Update(p);
            Assert.AreEqual("班长", target.FetchByKey(4).Name);
        }

        [TestCase]
        public void CheckPositionIsUsedTest() {
            //如果职位被应用,返回true
            Position p = new Position { Id = 1 };
            Assert.IsTrue(target.CheckPositionIsUsed(p.Id));
            p.Id = 2;
            Assert.IsFalse(target.CheckPositionIsUsed(p.Id));
        }

        [TestCase]
        public void DeleteByIdTest() {
            //如果职位在员工表中有应用则抛出异常
            Position p = target.FetchByKey(1);
            Assert.Throws<BusinessException>(() => target.DeleteById(p.Id));
            //删除成功之后,数据不存在返回null
            target.DeleteById(3);
            Assert.IsNull(target.FetchByKey(3));
        }
    }
}