使用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、源码下载

时间: 2024-10-12 20:02:19

使用Ninject+Moq在单元测试中抽象数据访问层的相关文章

【2017-04-20】Ado.Net与面向对象结合架构中的数据访问层(实体类,数据访问类)

开发项目三层架构:界面层.业务逻辑层.数据访问层 今天学习一下数据访问层,分为实体类和数据访问类 所有的类放在App_Code这个文件夹下边.养成一个好的习惯. 一.实体类 数据库中的表映射为一个类,类名与表名一致.表中的每一列,都为该类下的成员变量和属性也就是最简单的封装 把数据库中的表名变为类的类名. 把数据库中的每一个列,变为实体类中的成员变量和属性 列名与属性名一致.成员变量名:在列名前边加上下划线.因为在外部访问只能访问到属性,为了看起来一致. using System; using

系统架构师-基础到企业应用架构-数据访问层

一.上章回顾 上篇我们简单讲述了服务层架构模式中的几种,并且讲解了服务层的作用及相关的设计规范,其实我们应该知道,在业务逻辑层中使用领域模型中使用服务层才 能发挥出最大的优势,如果说我们在业务逻辑层还是使用非领域模型的模式话,服务层的作用仅体现在解耦作用.其实在业务逻辑层采用领域模型时,我们前面说的持 久化透明的技术,其实我们可以通过服务层来做,我们在服务层中处理领域对象信息的持久化操作.当然本篇可能不会深入讨论持久化透明的具体实现,后面会单独开 篇来讲述,我们先来回顾下上篇讲解的内容:  上图

asp.net-wingtip学习之创建数据访问层

一. 什么是数据访问层在wingtip项目中,数据访问层是对以下三者的总称:1. product类等数据相关的类(class)2. 数据库和存储类成员的数据表(database)3. 上述二者的交互操作. product类: 1 using System.ComponentModel.DataAnnotations; 2 3 namespace WingtipToys.Models 4 { 5 public class Product 6 { 7 [ScaffoldColumn(false)]

数据访问层的单元测试

出处:http://www.cnblogs.com/wintersun/ 数据访问层在分层结构,比较常见. 有时可能是数据访问模块. 假设数据访问层后端是数据库,那我们如何测试他们的呢? 有时实际这种测试是集成测试了.有时数据库里还有一些逻辑,触发器,约束等. 个人十分不建议把业务逻辑放在数据库里实现. 最常见的数据库表的操作create, read, update和delete(简称CRUD), 例如我们需要测试某个Add方法,在这个测试方法完成后, 希望这条测试数据清除掉. 这样做是 为了不

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

14、抽象工厂获取数据访问层的实例,缓存的使用和反射的使用

工厂类的代码: namespace Shop.DALFactory { /// <summary> /// 抽象工厂.完成数据层中对象的创建(反射对象) /// </summary> public class AbstractFactory { //获取程序集的名称 private static string DalAssemblyPath = ConfigurationManager.AppSettings["DalAssemblyPath"]; //获取程序

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

在 ASP.NET 中创建数据访问和业务逻辑层(转)

.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均与表示层分离.表示层由网站用户有权查看或更改数据的页面组成. ASP.NET 可通过多种方式提供数据访问.业务逻辑和表示形式之间的分离.例如,数据源模型(包括 LinqDataSource 和 ObjectDataSource 等服务器控件)可将表示层与数据访问代码和业务逻辑分离. 另一种模式是将数

OpenCV访问Mat对象中数据时发生异常---Mat中的数据访问

7.1和7.1.1由于越狱不成熟,半完美越狱后电脑上无法访问系统越狱目录,如var usr 等等. 今天有些意外地发现,可以在电脑上使用手机的越狱目录我手机 i4 7.1.1 联通 半完美越狱,没装Afc2Add,也没装Appsync 附上  --->我的半完美越狱过程 好了,下面直接正题 一.前提,必须安装ifile! 打开ifile,并转到 /var/mobile/media 目录下,然后点击右上角的 [ 编辑 ]如图: 二.点左下角的 + 号创建,如图: 三.点 [ 类型],选择[符号链接