【问题标题】:Cannot instantiate proxy of class error无法实例化类错误的代理
【发布时间】:2017-07-04 10:39:35
【问题描述】:

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

Error Message Display Image

课程库

public class CourseRepository : GenericRepository<Course>
{
    public CourseRepository(SchoolContext context)
        : base(context)
    {
    }

工作单位

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

课程服务

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc


    【解决方案1】:

    在模拟的时候使用界面即可。

    Mock<ICourseRepository> mockRepo = new Mock<ICourseRepository>();
    mockRepo.Setup(m => m.GetByID(course.CourseID)).Returns(course);
    

    【讨论】:

      【解决方案2】:

      或者,如果您的类具有 internal 无参数构造函数,则需要将 InternalsVisibleTo 属性添加到程序集。

      如果是最小起订量,请添加:

      [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] 
      

      或者这个,如果你需要一个强键

      [assembly: InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
      

      【讨论】:

        【解决方案3】:

        错误提示CourseRepository 无法初始化,因为它没有无参数构造函数。模拟框架首先寻找无参数构造函数来创建模拟对象。

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

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

        除了 null,您还可以传递构造函数参数的模拟对象。

        【讨论】:

        • 这确实有帮助并且是一个有效的答案:)
        • 应该注意,首选的方法是模拟你的接口,而不是你的实现。 (var repositoryMock = new Mock&lt;ICourseRepository&gt;();)
        • 正确@Riscie。但是如果不使用接口,则需要模拟具体的类。
        • 完全正确@ChetanRanpariya。我只是想提一下,因为它很容易被忽视。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 2023-02-10
        相关资源
        最近更新 更多