Moq, unit test using xUnit framework and testing a function returning an object

江枫思渺然 提交于 2019-12-13 07:48:36

问题


I have a repository

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;
    ......
}

In my Service layer, I am having a service as

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};
    }
}

My Test code is

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);
         }
     }
}

I need to write a unit test for GetStudentById() and check the values returned by the function.

Please help me to how to mock the service layer.


回答1:


In the above we have two things happening within StudentsPersonalDetailsService.GetStudentById()

  1. Retrieve the student info from the repository.
  2. Create a student model from the data retrieved from the repository

Note: Something looks strange when reading from the repository. If the items in the repository are StudentPersonalDetails why create new instances

We can stub retrieving the student data like so

 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);
     }
 }

Creating the StudentModel objects is encapsulated in the Translator but because it is a static method on the 'StudentModel' we cannot mock it and will have to test the reading and conversion in one go.



来源:https://stackoverflow.com/questions/45012779/moq-unit-test-using-xunit-framework-and-testing-a-function-returning-an-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!