使用自定义模型对WebAPI进行单元测试

时间:2016-05-13 10:07:03

标签: c# unit-testing asp.net-web-api moq

我在数据库中有2个表,结构看起来像

  

学生[身份证,姓名,电邮,性别]

     

测试[Id,StudentId,姓名,状态]

     

UserSummary [Id,Name,Email,Gender,TestName,TestStatus]

那么在单元测试方法中我应该验证哪一个? db模型或自定义模型?

我的API端点将[TestMethod] public void GetAllStudents() { IQueryable<Student> masterdata = new List<Student> { new Student {StudentID=1, Firstname = "AAA",Active_InActive=1 }, new Student {StudentID=2, Firstname = "BBB" ,Active_InActive=1 }, new Student {StudentID=3, Firstname = "ZZZ" ,Active_InActive=1 }, }.AsQueryable(); var mockSet = new Mock<DbSet<Student>>(); mockSet.As<IQueryable<Student>>().Setup(m => m.Provider).Returns(masterdata.Provider); mockSet.As<IQueryable<Student>>().Setup(m => m.Expression).Returns(masterdata.Expression); mockSet.As<IQueryable<Student>>().Setup(m => m.ElementType).Returns(masterdata.ElementType); mockSet.As<IQueryable<Student>>().Setup(m => m.GetEnumerator()).Returns(masterdata.GetEnumerator()); var mockContext = new Mock<SchoolDbEntities>(); mockContext.Setup(c => c.Students).Returns(mockSet.Object); var service = new StudentDbHandler(mockContext.Object); var students = service.GetStudents(); //it returns list of Student //So should i test Db models are same or Custom List<UserSummary> models are same? } 的列表作为JSON返回到前端。

{{1}}

因此,如果我必须验证自定义模型,我是否应该从Moq实体框架数据中模拟自定义模型?有人建议任何教程可以解释直接处理除Db模型之外的自定义模型数据的方式吗?

2 个答案:

答案 0 :(得分:1)

如果您开始测试db模型students结果,那么您真正测试的是模拟库实际上是有效的。

您应该测试对GetStudents()的调用以及它与mockContext的互动方式。我不知道该方法的内部结构,但我怀疑有调用数据库和验证检查。你会断言模拟上下文,看看它们是否按预期被调用。

您设置数据,以便检查数据是否进行有效测试。您需要测试与代码的交互。

答案 1 :(得分:0)

您应该在您的架构中集成一个用于数据访问的层(DAO)。该层将负责持久化对象和执行查询。

要测试此图层,除了针对真实数据库(可能是内存模式)进行测试之外别无选择。这将允许您验证映射和查询。

另一层(业务层)应该依赖于之前的DAO层。要测试业务层,您可以为DAO提供模拟。您可以在没有数据库的情况下测试业务层。

如果可能,请在您的业务层中使用DAO和不使用DAO的方法之间使用单独的方法。测试静态方法更容易,该方法在入口中接受实体并在输出中提供实体,有时不需要模拟。