使用Ninject+Moq在单元测试中抽象数据访问层

本文介绍如何使用Moq库模拟数据访问层逻辑,通过定义数据访问接口和实现类,结合Ninject进行依赖注入,最终在单元测试中利用Moq替代真实的数据访问操作。


一、测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑
 
 
二、步骤如下
2.1 定义数据访问接口和实现
 public interface IDBAccess
    {
        List<string> GetList(string request);
    }  
 
     public class DBAccessImp : IDBAccess
    {
        public List<string> GetList(string request)
        {
            throw new NotImplementedException();
        }
    }
2.2 使用Ninject维护接口和实现的关系,并在业务类的构造函数中进行注入
     a) 初始化Ninject
  
static void Main(string[] args)
        {
            //创建Ninject内核实例
            IKernel ninjectKernel = new StandardKernel();
 
            //绑定接口到实现了该接口的类
            ninjectKernel.Bind<IDBAccess>().To<DBAccessImp>();
        } 
 
      b) 业务类(构造函数注入) 
 public class TestClass
    {
        private IDBAccess db = null;
        public TestClass(IDBAccess db)
        {
            this.db = db;
        }
 
        public List<string> GetList()
        { 
            //这里可认为是调用数据访问层的实现代码
            var response = this.db.GetList("Hello");
 
            return response;
        }
    } 
 
2.3 在单元测试中使用Moq抽象模拟数据访问层逻辑
 
[TestCategory("测试分类")]
        [TestMethod]
        public void GetListTest()
        {
            var mockDb = new Mock<IDBAccess>();
 
            var list = new List<string>();
            list.Add("Hello");
            list.Add("World");
            list.Add("James");
 
            //设置请求参数;返回参数等
            mockDb.Setup(m => m.GetList(It.IsAny<string>()))
            .Returns(list);
 
            TestClass test = new TestClass(mockDb.Object);
            //执行TestClass.GetList()方法时
            //不会实际的去调用数据访问层
            //而是用list的值作为GetList()方法的返回值(返回Hello、World、James集合)
            //这样以后每次测试GetList()中其他业务逻辑时,就不用初始化数据库数据,直接用
            //Moq模拟的数据即可
            test.GetList();
        }  

 

 3、源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值