我有一个项目,我非常积极地将其划分为不同的层。我有
- REST 服务 (asp.net Web API)
- 服务层
- 数据层
- 过滤器(数据层之上的扩展方法)
- 多个模型和单独的 DTO
- 数据库上下文
我应该进行什么单元测试?
从技术上讲,我的 REST 服务指向我的服务。因此,如果我测试我的 REST,我也在测试我的服务。
模型,我不知道如何测试这些?
DBContext,有必要测试这些吗?
如果我测试我的服务,我正在测试我的 DataLayer
我有一个项目,我非常积极地将其划分为不同的层。我有
我应该进行什么单元测试?
从技术上讲,我的 REST 服务指向我的服务。因此,如果我测试我的 REST,我也在测试我的服务。
模型,我不知道如何测试这些?
DBContext,有必要测试这些吗?
如果我测试我的服务,我正在测试我的 DataLayer
一个好的经验法则是任何包含业务逻辑的东西都应该能够进行单元测试。理想情况下,您的所有层都将由接口分隔,并且您应该能够将模拟接口注入各个层。任何访问外部组件(磁盘、数据库、网络等)的东西也应该被抽象掉。例如,在您的数据层中,负责打开与数据库的连接、运行 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 服务器打开侦听点。希望这些很少。
测试DataLayer的时候尽量mock REST Service层,其他的也一样。
单元测试只测试逻辑,与其他系统或计算机交互的代码不应包含在单元测试范围内(如网络IO、数据库访问、磁盘IO、调用其他系统的接口等)