Moq,使用xUnit框架进行单元测试并测试返回对象的函数

时间:2017-07-10 13:00:33

标签: unit-testing asp.net-core-mvc moq xunit.net

我有一个存储库

public class StudentsPersonalDetailsRepository : IStudentPersonalDetailsRepository
{
    private readonly StudentManagementSystemEntities _studentsDbContext;
    private readonly ILogger _logger;
    public StudentsPersonalDetailsRepository(StudentManagementSystemEntities context, ILogger<IStudentPersonalDetailsRepository> logger)
    {
        _studentsDbContext = context;
        _logger = logger;
    }
    public IQueryable<StudentPersonalDetails> StudentPersonalDetails => _studentsDbContext.StudentPersonalDetails;
    ......
}

在我的服务层,我正在提供服务

public class StudentsPersonalDetailsService:IStudentPersonalDetailsService
{
    private readonly IStudentPersonalDetailsRepository _repository;
    private readonly ILogger _logger;
    public StudentsPersonalDetailsService(IStudentPersonalDetailsRepository studentPersonalDetailsRepository,ILogger<StudentsPersonalDetailsService> logger)
    {
        _repository = studentPersonalDetailsRepository;
        _logger = logger;
    }
    ......
    ......
    public StudentModelResponse GetStudentById(int id)
    {
        Domain.Entities.StudentPersonalDetails obj = _repository.StudentPersonalDetails.
                                                    Where(i => i.RollNo == id)
                                                    .Select(i=>new Domain.Entities.StudentPersonalDetails {
                                                        RollNo=i.RollNo,
                                                        FirstName=i.FirstName,
                                                        LastName=i.LastName,
                                                        MailId=i.MailId,
                                                        MiddleName=i.MiddleName,
                                                        DateOfBirth=i.DateOfBirth,
                                                        GenderOfPerson=i.GenderOfPerson
                                                    }).FirstOrDefault();
        StudentModel ob = StudentModel.Translator(obj);
        return new StudentModelResponse { StudentModel=ob};
    }
}

我的测试代码是

namespace StudentUnitTests
{
     public class StudentServiceShould
     {
         [Theory]
         [InlineData(1)]
         public void AbleToRetrieveStudentById(int n)
         {
             var mock = new Mock<IStudentPersonalDetailsRepository>();
             var logger = new Mock<ILogger<StudentsPersonalDetailsService>> ();
             var ob = new StudentsPersonalDetailsService(mock.Object, logger.Object);
         }
     }
}

我需要为GetStudentById()编写单元测试并检查函数返回的值。

请帮我看看如何模拟服务层。

1 个答案:

答案 0 :(得分:0)

在上面我们在StudentsPersonalDetailsService.GetStudentById()

中发生了两件事
  1. 从存储库中检索学生信息。
  2. 根据从存储库中检索的数据创建学生模型
  3. 注意:从存储库读取时看起来很奇怪。如果存储库中的项目为StudentPersonalDetails,为什么要创建新实例

    我们可以像这样存根检索学生数据

     public class StudentServiceShould
     {
         [Theory]
         [InlineData(1)]
         public void AbleToRetrieveStudentById(int n)
         {
            var students = new []{
              // new Domain.Entities.StudentPersonalDetails for student role 1,
              // new Domain.Entities.StudentPersonalDetails for student role 2,
              // new Domain.Entities.StudentPersonalDetails for student role 3
            };         
    
    
             var mock = new Mock<IStudentPersonalDetailsRepository>();
             mock.SetupGet(mk => mk.StudentPersonalDetails).Returns(students.AsQueryable());
             var logger = new Mock<ILogger<StudentsPersonalDetailsService>> ();
             var ob = new StudentsPersonalDetailsService(mock.Object, logger.Object);
         }
     }
    

    创建StudentModel对象封装在Translator中,但因为它是&#39; StudentModel&#39;上的静态方法。我们不能嘲笑它,必须一次性测试阅读和转换。

相关问题