一、测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用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、源码下载