我在数据库中有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模型之外的自定义模型数据的方式吗?
答案 0 :(得分:1)
如果您开始测试db模型students
结果,那么您真正测试的是模拟库实际上是有效的。
您应该测试对GetStudents()
的调用以及它与mockContext
的互动方式。我不知道该方法的内部结构,但我怀疑有调用数据库和验证检查。你会断言模拟上下文,看看它们是否按预期被调用。
您设置数据,以便检查数据是否进行有效测试。您需要测试与代码的交互。
答案 1 :(得分:0)
您应该在您的架构中集成一个用于数据访问的层(DAO)。该层将负责持久化对象和执行查询。
要测试此图层,除了针对真实数据库(可能是内存模式)进行测试之外别无选择。这将允许您验证映射和查询。
另一层(业务层)应该依赖于之前的DAO层。要测试业务层,您可以为DAO提供模拟。您可以在没有数据库的情况下测试业务层。
如果可能,请在您的业务层中使用DAO和不使用DAO的方法之间使用单独的方法。测试静态方法更容易,该方法在入口中接受实体并在输出中提供实体,有时不需要模拟。