使用 Isolate.Fake.AllInstance<>() 创建分离的伪造对象

Creating separated faked objects using Isolate.Fake.AllInstance<>()

我有一个 Student class 和一个 Course class:

public class Student
{
    public Student()
    {
        courses = Enumerable.Range(0, 3).Select(i => new Course { Grade = random.Next(0, 100) }).ToList();
    }
    private static Random random = new Random();

    public List<Course> courses { get; } 

    public void StudentTestMethod() => courses.ForEach(course => course.CourseMethod());
}

public class Course
{
    public int Grade { get; set; }

    public void CourseMethod() => Console.WriteLine(string.Format("Not Faked, grade = {0}", Grade));
}

Student的构造函数中,我们创建了3个Course对象并随机设置了成绩。 我有以下单元测试:

public void TestMethod1()
{ 
    var fake = Isolate.Fake.AllInstances<Course>();
    Isolate.WhenCalled(() => fake.CourseMethod()).DoInstead(c =>
    {
        Console.WriteLine(string.Format("Faked, grade = {0}", fake.Grade));
    });
    Enumerable.Range(0, 5).ToList().ForEach(i =>
    {
        new Student().StudentTestMethod();
    });
}

我试图伪造 Course 的所有实例,这样每个学生都会有 3 个不同的成绩,但我得到的输出是,例如:

Faked = 27 Faked = 27 Faked = 27, Faked = 44 Faked = 44 Faked = 44, Faked = 11
Faked = 11 Faked = 11, Faked = 62 Faked = 62 Faked = 62, Faked = 52 Faked = 52
Faked = 52.

关于如何使用 Typemock 隔离器让每个学生有 3 个不同的成绩有什么想法吗?

你可以这样写你的测试:

    public void TestMethod()
    {
        List<Course> CourseList = new List<Course>();
        Enumerable.Range(0, 5).ToList().ForEach(i =>
        {

            Enumerable.Range(0, 3).ToList().ForEach(j =>
            {
                var fake = Isolate.Fake.NextInstance<Course>();
                Isolate.WhenCalled(() => fake.CourseMethod()).DoInstead(c =>
                {
                    Console.WriteLine(string.Format("Faked = {0}", fake.Grade));
                });
                CourseList.Add(fake);
            }

            );
            new Student().StudentTestMethod();

        });

    }