您的位置:首页 > 其它

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

2014-11-15 21:46 260 查看
一、测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用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、源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: