Je fais un test unitaire simple où lors de la création d'un cours, le champ Titre ne peut pas être vide. Je dois le tester avec une classe de service qui a l'injection de dépendance avec UnitOfWork. Lorsque je débogue mon test, j'obtiens une erreur d'exception de Can not instantiate proxy of class: ContosoUniversity.Models.CourseRepository
J'ai examiné l'erreur, mais je n'arrive pas à comprendre comment résoudre le problème et l'instruction Assert?
Image d'affichage du message d'erreur
Dépôt de cours
public class CourseRepository : GenericRepository<Course>
{
public CourseRepository(SchoolContext context)
: base(context)
{
}
UnitOfWork
public class UnitOfWork : IDisposable, IUnitOfWork
{
private SchoolContext context = new SchoolContext();
private GenericRepository<Department> departmentRepository;
private CourseRepository courseRepository;
public CourseRepository CourseRepository
{
get
{
if (this.courseRepository == null)
{
this.courseRepository = new CourseRepository(context);
}
return courseRepository;
}
}
public virtual CourseRepository GetCourseRepository()
{
if (this.courseRepository == null)
{
this.courseRepository = new CourseRepository(context);
}
return courseRepository;
}
CourseService
public class CourseService : ICourseService
{
private IUnitOfWork unitOfWork;
public CourseService (IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
}
public void Create(Course course)
{
unitOfWork.GetCourseRepository().Insert(course);
unitOfWork.Save();
}
public Course GetCourseByID(int id)
{
return unitOfWork.GetCourseRepository().GetByID(id);
}
Méthode de test
[TestMethod]
public void TestMethod1()
{
var course = new Course
{
CourseID = 2210,
Title = string.Empty,
Credits = 3,
DepartmentID = 1
};
Mock<CourseRepository> mockRepo = new Mock<CourseRepository>();
mockRepo.Setup(m => m.GetByID(course.CourseID)).Returns(course);
var mockUnit = new Mock<IUnitOfWork>();
mockUnit.Setup(x => x.GetCourseRepository()).Returns(mockRepo.Object);
var myService = new CourseService(mockUnit.Object);
myService.Create(course);
//var error = _modelState["Title"].Errors[0];
//Assert.AreEqual("The Title field is required.", error.ErrorMessage);
//mockRepo.Setup(x => x.Insert(course));
}
L'erreur indique que CourseRepository
ne peut pas être initialisé car il n'a pas de constructeur sans paramètre. Le framework de simulation cherche d'abord le constructeur sans paramètre pour créer un objet de simulation.
Si votre classe n'a pas de constructeur sans paramètre, vous devez passer ces paramètres lorsque vous créez Mock. Dans votre cas, une maquette de CourseRepository
serait créée comme suit.
var repositoryMock = new Mock<CourseRepository>(null);
Au lieu de null, vous pouvez également passer des objets fictifs des paramètres du constructeur.