首页 > 代码库 > 使用Ninject+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、源码下载

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