单元测试:REST服务以及数据层,服务层以及模型如何?

时间:2012-06-12 07:33:02

标签: entity-framework unit-testing asp.net-web-api

我想知道是否有人可以提供帮助,我有一个项目,我已经非常积极地分为不同的层。

我有

REST服务(asp.net Web Api) 服务层 数据层 过滤器(数据层顶部的扩展方法) 许多模型和单独的DTO 的DbContext

我应该测试什么?

从技术上讲,我的REST服务指向我的服务。所以,如果我测试我的REST,我也在测试我的服务。

模特,我看不出我怎么测试这些?

DBContext,是否有必要对它们进行测试?

如果我测试我的服务,我正在测试我的DataLayer

我真的很感激任何反馈

2 个答案:

答案 0 :(得分:1)

一个好的经验法则是包含业务逻辑的任何东西都应该能够进行单元测试。理想情况下,所有图层都将通过接口分隔,您应该能够将模拟接口注入各个图层。任何访问外部组件(磁盘,数据库,网络等)的东西也应该被抽象掉。例如,在您的数据层中,应该抽象出负责打开与数据库的连接,运行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服务器。希望这些很少见。

答案 1 :(得分:0)

尝试在测试DataLayer时模拟REST服务层,与其他人一样。

仅在单元测试中测试逻辑,与其他系统或计算机交互的代码不应包含在单元测试范围内(如网络IO,DB访问,磁盘IO,调用其他系统的接口,等)