单元测试:REST服务以及数据层,服务层和模型?
问题描述:
我想知道是否有人可以帮忙,我有一个项目,我已经非常积极地分为不同的层次。单元测试:REST服务以及数据层,服务层和模型?
我有
REST服务(asp.net网页API) 服务层 数据层 滤波器(上数据层的顶部的扩展方法) 一些模型和单独的DTO 的的DbContext
我应该测试什么?
从技术上讲,我的REST服务点在我的服务。所以如果我测试我的REST,我也在测试我的服务。
模型,我不明白我该如何测试这些?
DBContext,是否需要测试这些?
如果我测试我的服务我测试我的数据层
我真的很感激任何反馈
答
一个很好的经验法则是任何包含业务逻辑的应该能够被单元测试。理想情况下,所有的图层都会被接口分开,您应该能够将模拟的接口注入到各个图层中。任何访问外部组件(磁盘,数据库,网络等)的东西也应该被抽象出来。例如,在数据层中,负责打开与数据库的连接,运行SQL语句以及关闭连接的代码应该被抽象出来。然后你可以模拟数据访问接口和你想测试的代码,可以被测试。在这个例子中数据访问层方法嘲笑
var mockAdapter = new Mock<IDataAdapter>();
var repo = new Mock<RepositoryObject> (mockAdapter.Object) { CallBase = true };
var param = new Mock<IDbDataParameter>();
param.Setup(mock => mock.Value).Returns("TEST RESPONSE");
var bindParam = new DynamicParameters.ParamInfo { Name = "strResponse", AttachedParam = param.Object };
var paramList = new DynamicParameters();
paramList.Parameters.Add("strResponse", bindParam);
repo.Setup(mock => mock.GetParameters(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<int>(), It.IsAny<string>())).Returns(paramList);
string actual = repo.Object.ExecuteSomeSqlStatement(string.Empty, string.Empty, int.MinValue, string.Empty);
Assert.AreEqual("TEST RESPONSE", actual);
至于你的模型,如果它们只包含的属性然后在测试他们也是没有用处的。
有些情况下,单元测试没有意义,比如创建一个打开侦听点的TCP服务器。希望这些是少之又少的。
答
尝试测试数据层,同样把别人当嘲笑REST服务层。
只有在单元测试中应该测试逻辑,与其他系统或计算机交互的代码不应该包含在单元测试范围内(如网络IO,DB访问,磁盘IO,调用其他系统的接口等)
谢谢,就是我在找的东西。 – Martin