无法实例化类错误的代理

Aft*_*ton 15 c# asp.net asp.net-mvc

我正在进行一个简单的单元测试,在创建课程时,Title字段不能为空.我不得不使用具有UnitOfWork的依赖注入的服务类来测试它.当我调试我的测试时,我收到一个异常错误,Can not instantiate proxy of class: ContosoUniversity.Models.CourseRepository我查看了错误,但我无法理解如何解决问题和Assert语句?

错误消息显示图像

CourseRepository

public class CourseRepository : GenericRepository<Course>
{
    public CourseRepository(SchoolContext context)
        : base(context)
    {
    }
Run Code Online (Sandbox Code Playgroud)

的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;
    }
Run Code Online (Sandbox Code Playgroud)

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);
    }
Run Code Online (Sandbox Code Playgroud)

测试方法

[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));
}
Run Code Online (Sandbox Code Playgroud)

Che*_*iya 52

该错误表示CourseRepository无法初始化,因为它没有参数较少的构造函数.模拟框架首先查找参数较少的构造函数以创建模拟对象.

如果您的类没有无参数构造函数,那么您需要在创建Mock时传递这些参数.在你的情况下,模拟CourseRepository将创建如下.

var repositoryMock = new Mock<CourseRepository>(null);
Run Code Online (Sandbox Code Playgroud)

您也可以传递构造函数参数的模拟对象,而不是null.

  • 应该注意的是,首选方法是模拟您的接口,而不是您的实现。(`var repositoryMock = new Mock&lt;ICourseRepository&gt;();`) (5认同)
  • 完全正确@ChetanRanpariya。我只是想提一下,因为它很容易被忽视。 (3认同)
  • 正确的@Riscie。但如果不使用接口,则需要模拟具体类。 (2认同)

Ε Г*_*И О 6

模拟时只需使用接口即可。

Mock<ICourseRepository> mockRepo = new Mock<ICourseRepository>();
mockRepo.Setup(m => m.GetByID(course.CourseID)).Returns(course);
Run Code Online (Sandbox Code Playgroud)