2017-02-15 27 views
5

Wykonuję prosty test jednostkowy, w którym podczas tworzenia kursu pole tytułu nie może być puste. Muszę przetestować go z klasą usług, która ma Dependency Injection z UnitOfWork. Kiedy debuguję mój test, otrzymuję błąd wyjątku od Can not instantiate proxy of class: ContosoUniversity.Models.CourseRepository Sprawdziłem błąd, ale nie jestem w stanie zrozumieć, jak rozwiązać problem i instrukcję Assert?Nie można utworzyć wystąpienia błędu klasy błędu

Error Message Display Image

CourseRepository

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

TestMethod

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

Odpowiedz

8

Błąd mówi, że CourseRepository nie można zainicjować, ponieważ nie posiada parametru mniej konstruktora. Szalony szkielet szuka konstruktora, który pomija mniej parametrów, aby utworzyć fałszywy obiekt.

Jeśli twoja klasa nie ma konstruktora bez parametrów, musisz przekazać te parametry podczas tworzenia makiety. W twoim przypadku makiety z CourseRepository zostaną utworzone w następujący sposób.

var repositoryMock = new Mock<CourseRepository>(null); 

Zamiast wartości null można również przekazywać symulowane obiekty parametrów konstruktora.

+1

To powinno być oznaczone jako odpowiedź –