问题
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()
- Retrieve the student info from the repository.
- 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