zoukankan      html  css  js  c++  java
  • 使用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、源码下载

  • 相关阅读:
    分享两个你可能不知道的Java小秘密
    一次ssl的手动实现——加密算法的简单扫荡
    TCP/IP中最高大上的链路层简介(二)
    与TCP/IP协议的初次见面(一)
    高并发下的九死一生,一个不小心就掉入万丈深渊
    杂谈---一个项目经理的自我反省
    浅谈程序员的行业选择---程序人生
    杂谈---大压力下的工作
    一个有意思的需求——中文匹配度
    杂谈---一个人的两种心理
  • 原文地址:https://www.cnblogs.com/gossip/p/4100296.html
Copyright © 2011-2022 走看看