2016-05-13 46 views
0

我有一个数据库2个表和结构看起来像单元测试的WebAPI用自定义模型

学生[ID,姓名,电子邮件地址,性别]

测试[ID,​​StudentId,名称,状态]

UserSummary [ID,姓名,电子邮件地址,性别,测试名,TestStatus]

所以在单元测试的做法,应该我验证? db模型还是自定义模型?

我的API端点返回列表UserSummary作为JSON返回到前端。

[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? 
} 

所以,如果我要验证自定义模型,我应该嘲笑定制模型以及从起订量实体框架数据?有人可以建议任何教程解释直接处理除Db模型以外的自定义模型数据的方式吗?

回答

0

您应该在您的体系结构中集成用于数据访问的图层(DAO)。该层将负责持久化对象并执行查询。

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

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

如果可能的话,您的业务层中使用DAO的方法与不使用DAO的方法分开。测试一个静态方法比较容易,该方法需要输入实体并在输出中提供实体,有时不需要模拟。

+0

问题是我是否应该验证db模型或我的自定义模型?如果它的自定义模型,我应该如何从moq列表中获取它们?在单元测试项目中,我应该将其转换为 –

+0

您测试依赖于其他服务的服务X.您应该问的问题是“我需要服务Y来测试服务X还是使用模拟服务Y”。你不应该问“我需要测试我的自定义模型吗?”您的自定义模型的存在可以帮助您测试其他内容。 – mvera

1

如果你开始测试数据库模型students结果,那么你真正测试的是模拟库实际工作。

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

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

+0

在我的情况下,函数GetStudents()返回表Student的项目列表。但是我的实际API端点使用这个Db模型构造了一个StudentViewModel。所以在这种情况下,我应该如何编写UnitTest。我无法找到任何样本解释这个概念[我的意思是处理数据库模型和包装对象模型]。有没有任何教程或文章解释这种方法 –