我正在进行一个简单的单元测试,其中在创建课程时,“标题”字段不能为空。我必须使用具有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));
}
4条答案
按热度按时间2g32fytz1#
错误指出无法初始化
CourseRepository
,因为它没有无参数构造函数。模拟框架首先查找无参数构造函数以创建模拟对象。如果你的类没有无参数的构造函数,那么你需要在创建Mock时传递这些参数。在你的例子中,
CourseRepository
的mock将被创建如下。除了null,您还可以传递构造函数参数的模拟对象。
qzwqbdag2#
嘲笑的时候就用界面。
fcg9iug33#
或者,如果类有一个internal无参数构造函数,则需要将
InternalsVisibleTo
属性添加到assembly。在Moq的情况下,添加以下内容:
或者这个如果你需要一把很强的钥匙
lp0sw83n4#
在我的例子中,向mock添加
[Frozen]
属性有助于解决这个问题。我也遇到了“无法示例化类的代理错误”,但在我的例子中,我做了类似这样的事情:
对我来说,在我的套件的方法中调用了麻烦对象的方法,当它到达SomeMethodAsync()时,异常就发生了。当我在麻烦对象之前添加了[Frozen]标记时,问题就解决了。