数据库单元测试的一点尝试

数据库单元测试的一点尝试

概要:

  • 数据库单元测试的策略
  • 一般处理方式
  • 遇到的问题以及处理思路

数据库单元测试的策略

毫无疑问,数据库数据模拟单元测试是有必要的,而且需要通过集成测试方式真正在数据库环境中做到
数据在事务中控制,通过回滚,零污染,数据没有真正添加到数据库
通过数据测试父类或委托方法方式来封装事务相关代码
要考虑应对数据模型变化时的应对,我使用的是UnitOfWork设计模式封装的EntityFrameowrk,Code First方式处理数据访问层,所以数据模型会经常剧烈变化,之前就这里遇到了问题,后面会提及

一般处理方式

代码块

数据测试基类DBTestBase,网上也有类似的代码,关键代码例如:

    #`这里写代码片`region 成员变量区域
        private TransactionScope _scope;
        #endregion

        #region 每个测试方法调用前初始化,均打开独立的事务作用域
        [TestInitialize]
        public virtual void Setup()
        {
            _scope = new TransactionScope();
        }
        #endregion

        #region 每个测试方法调用后触发,独立的事务销毁,回滚操作,不提交事务
        [TestCleanup]
        public virtual void TearDown()
        {
            _scope.Dispose();
        }
        #endregion

        #region 默认初始化IOC组件
        /// <summary>
        /// 默认初始化IOC组件
        /// 模型变化时处理方式
        /// </summary>
        protected static void Init()
        {
            BootStrapper.InitMap();
        //模型变化时处理
            HandleIfModelChangeThenCreateOrDropDBThrowTransactionException();
        }

遇到的问题以及处理思路

代码块

测试方法都包裹在外层事务中,模型变化时,EntityFramework都会根据数据库初始化设置,对已存在数据库进行删除,就会抛出SqlException,提示不能在事务中执行DropDataBase命令,那我就写了个不优美然而还真有用的方法HandleIfModelChangeThenCreateOrDropDBThrowTransactionException(),在里面就执行简单查询,就可以让数据库适应模型变化,然后再去执行包裹在事务控制中的测试方法,例如:
C#
/// <summary>
/// 使用了一种取巧的做法处理因模型改变引发数据库创建或删除,因使用外层事务包裹,会发生异常的情形
/// </summary>
private static void HandleIfModelChangeThenCreateOrDropDBThrowTransactionException()
{
using (GeneralDataContext ctx = new GeneralDataContext())
{
ctx.Members.Count();
}
}
#endregion


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值