gpt4 book ai didi

c# - 使用私有(private)构造函数对类进行单元测试

转载 作者:行者123 更新时间:2023-12-03 18:28:31 26 4
gpt4 key购买 nike

我正在尝试测试一个只有私有(private)构造函数的类。这是一个类(class)注册系统。类(class)不是通过我们的应用程序创建的,因此我们故意没有公共(public)构造函数。相反,我们使用 EF 来获取数据库中已经存在的类(class),并将学生注册到这些类(class)中。
我正在尝试测试 Course 类的 register 方法,但是我无法创建实例。我可以使用course = (Course)Activator.CreateInstance(typeof(Course), true); ,但是我没有办法设置必要的属性,因为它们是私有(private)的。
在没有构造函数的情况下进行单元测试的推荐方法是什么?
这是代码的精简版本。

public class Course
{
private Course()
{
}

public int Id { get; private set; }
public string Name { get; private set; }
public bool Open { get; private set; }
public virtual ICollection<Student> Students { get; private set; }

public void Register(string studentName)
{
if (Open)
{
var student = new Student(studentName);
Students.Add(student);
}
}
}
//用法//
using (var db = new SchoolContext())
{
var course = db.Courses.Include(x => x.Students).Where(x => x.Name == courseName).First();

course.Register(studentName);
db.SaveChanges();
}
//单元测试//
[Fact]
public void CanRegisterStudentForOpenClass(){
// HERE I HAVE NO WAY TO CHANGE THE OPEN VARIABLE
var course = (Course)Activator.CreateInstance(typeof(Course), true);
course.Register("Bob");
}




最佳答案

是的,您可以使用反射。您的代码几乎不存在;
您可以使用 typeof(Course).GetProperty("PropertyName") 获取类型的属性和字段那么你可以使用SetValue设置所需的值,并首先将要修改的实例作为参数传递,然后再传递该值。
在你的情况下true ;
注意:在您的示例中,您还需要添加学生集合,如果您的 Open是真的。
这里有一个工作示例:

[Fact]
public void CanRegisterStudentForOpenClass()
{
var course = (Course)Activator.CreateInstance(typeof(Course), true);

typeof(Course).GetProperty("Open").SetValue(course, true, null);
ICollection<Student> students = new List<Student>();
typeof(Course).GetProperty("Students").SetValue(course, students, null);

course.Register("Bob");

Assert.Single(course.Students);
}

关于c# - 使用私有(private)构造函数对类进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63400165/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com