【问题标题】:Unit testing WebAPI with a custom model使用自定义模型对 WebAPI 进行单元测试
【发布时间】:2016-05-13 10:07:02
【问题描述】:

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

学生 [ID、姓名、电子邮件、性别]

测试 [Id,StudentId,Name,Status]

UserSummary [Id, Name , Email, Gender,TestName,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?
}

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

【问题讨论】:

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


    【解决方案1】:

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

    您应该测试对GetStudents() 的调用以及它如何与mockContext 交互。我不知道该方法的内部结构,但我怀疑存在对数据库和验证检查的调用。您将针对模拟上下文进行断言,以查看它们是否按预期调用。

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

    【讨论】:

    • 在我的例子中,函数 GetStudents() 返回表 Student 中的项目列表。但是我的实际 API 端点使用这个 Db 模型构造了一个 StudentViewModel。所以在这种情况下我应该如何编写 UnitTest 。我找不到任何示例来解释这个概念[我的意思是处理数据库模型和包装器对象模型]。是否有任何教程或文章解释了这种方法
    【解决方案2】:

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

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

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

    如果可能,请在业务层中将使用 DAO 的方法和不使用 DAO 的方法分开。测试一个静态方法更容易,该方法在输入中获取实体并在输出中提供实体,有时不需要模拟。

    【讨论】:

    • 问题是我应该验证数据库模型还是我的自定义模型?如果它的自定义模型我应该如何从最小起订量列表中获取它们?在单元测试项目中,我应该转换它
    • 您测试依赖于其他服务 Y 的服务 X。您应该问自己的问题是“我需要服务 Y 来测试服务 X 还是使用模拟服务 Y”。您不应该问“我需要测试我的自定义模型吗?”您的自定义模型可以帮助您测试其他内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2014-05-17
    相关资源
    最近更新 更多