[英]Cannot instantiate proxy of class error
我正在做一个简单的单元测试,在创建课程时,标题字段不能为空。 我必须使用具有 UnitOfWork 依赖注入的服务 class 对其进行测试。 当我调试我的测试时,我收到异常错误Can not instantiate proxy of class: ContosoUniversity.Models.CourseRepository
我查看了错误,但无法理解如何解决该问题和 Assert 语句?
课程资料库
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));
}
该错误表示无法初始化CourseRepository
因为它没有无参数构造函数。 模拟框架首先寻找无参数构造函数来创建模拟对象。
如果您的类没有无参数构造函数,那么您需要在创建 Mock 时传递这些参数。 在您的情况下, CourseRepository
模拟将创建如下。
var repositoryMock = new Mock<CourseRepository>(null);
除了 null,您还可以传递构造函数参数的模拟对象。
或者,如果您的类具有内部无参数构造函数,则需要将InternalsVisibleTo
属性添加到程序集。
如果是起订量,请添加以下内容:
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
或者这个,如果你需要一个强键
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdcf9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff62abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")]
只需在模拟时使用该接口。
Mock<ICourseRepository> mockRepo = new Mock<ICourseRepository>();
mockRepo.Setup(m => m.GetByID(course.CourseID)).Returns(course);
在我的例子中,将[Frozen]
属性添加到我的模拟中有助于解决这个问题。
我也有“无法实例化 class 错误的代理”,但就我而言,我正在做这样的事情:
[Theory, AutoMoqDate]
public async void Should_DoThis_When_ThatHappens(
Fixture fixture,
Mock<TroublesomeClass> troublesomeObject
){
var someResult = SomeObject();
troublesomeObject.Setup(o => o.SomeMethodAsync().ReturnsAsync(someResult);
// Code bellow is irrelevant...
}
对我来说,troublesomeObject 的方法是在我的套件方法中调用的,当它到达 SomeMethodAsync() 时就是异常发生的时候。 当我在麻烦的 object 之前添加 [Frozen] 标签时,问题就平息了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.