如何通过Typemock Isolator让每个Student拥有3个不同Grade的假Course
解决每个Student的假Course实例拥有不同Grade的方案
要实现每个Student的3个假Course拥有不同Grade,核心思路是在伪造Course实例时动态为每个实例分配唯一的Grade值,而不是给所有伪造实例设置固定值。下面用Typemock Isolator给出具体实现方案:
1. 核心实现逻辑
我们可以借助Isolate.Fake.AllInstances的回调能力,在每个假Course实例创建时,动态生成随机(或递增)的Grade,同时替换CourseMethod的输出行为,让它打印当前实例的伪造Grade。
完整单元测试代码示例
[TestClass] public class StudentTests { [TestMethod] public void StudentTestMethod_FakedCourses_HaveUniqueGradesPerInstance() { // 初始化随机数生成器,用于生成不同Grade var gradeRandomizer = new Random(); // 伪造所有Course实例,自定义每个实例的属性和方法行为 Isolate.Fake.AllInstances<Course>(fakeConfig => { // 拦截Grade属性的访问,每次返回新的随机值 fakeConfig.WhenCalled(course => course.Grade) .WillReturn(() => gradeRandomizer.Next(0, 100)); // 替换CourseMethod的执行逻辑,输出当前实例的伪造Grade fakeConfig.WhenCalled(course => course.CourseMethod()) .DoInstead(context => { var targetCourse = (Course)context.Instance; Console.WriteLine($"Faked = {targetCourse.Grade}"); }); }); // 创建Student实例,此时它的3个Course都是伪造且Grade不同的 var testStudent = new Student(); testStudent.StudentTestMethod(); // 可选:添加断言验证3个Course的Grade确实不同 var courseGrades = testStudent.courses.Select(c => c.Grade).ToList(); Assert.AreEqual(3, courseGrades.Distinct().Count()); } }
2. 关键细节说明
- 动态生成Grade:通过
WillReturn(() => gradeRandomizer.Next(0, 100)),让每个假Course实例的Grade属性在被访问时返回一个全新的随机值,确保每个实例的Grade唯一。 - 实例级方法替换:在
DoInstead中通过context.Instance获取当前调用方法的Course实例,这样输出的Grade就是该实例独有的值,不会出现所有实例输出相同内容的问题。 - 可选的规律化Grade:如果不想用随机数,也可以用计数器生成递增的Grade,比如:
这样每个新创建的Course实例Grade会依次增加15,同样能保证唯一性。int gradeCounter = 0; fakeConfig.WhenCalled(course => course.Grade) .WillReturn(() => gradeCounter += 15);
内容的提问来源于stack exchange,提问作者HilaB
相关产品推荐
相关产品推荐

