C# 测试for循环运行了多少次
嗨,我有一个方法,它有两个for循环。该方法如下所示:C# 测试for循环运行了多少次,c#,unit-testing,moq,mstest,C#,Unit Testing,Moq,Mstest,嗨,我有一个方法,它有两个for循环。该方法如下所示: public ElearningSessionsDTO FilterElearningSession(IEnumerable<GetELearningSessionsForStudent_Result> eLearningSession) { var eLearningSessionDTO = new ElearningSessionsDTO(); var clossedLessons
public ElearningSessionsDTO FilterElearningSession(IEnumerable<GetELearningSessionsForStudent_Result> eLearningSession)
{
var eLearningSessionDTO = new ElearningSessionsDTO();
var clossedLessons = new List<LessonsInElearningDTO>();
var plannedLessons = new List<LessonsInElearningDTO>();
var groupLessons = eLearningSession.GroupBy(key => new { key.LessonNumber, key.LessonTitle, key.TargetDate },
data => new { data.Status, data.EventTitle });
foreach (var groupLesson in groupLessons)
{
bool isPlanned = false;
var lessonInElearningDTO = new LessonsInElearningDTO
{
LessonNumber = groupLesson.Key.LessonNumber,
LessonTitle = groupLesson.Key.LessonTitle,
TargetDate = groupLesson.Key.TargetDate
};
var assignmentsInLessonDTO = new List<AssignmentsInLessonDTO>();
foreach (var assignment in groupLesson)
{
var assignmentInLessonDTO = new AssignmentsInLessonDTO
{
EventTitle = assignment.EventTitle,
Status = assignment.Status
};
if (assignment.Status != (int)ElearningEventSubscriptionStatuses.Closed)
{
isPlanned = true;
}
assignmentsInLessonDTO.Add(assignmentInLessonDTO);
}
lessonInElearningDTO.LessonsAssignments = assignmentsInLessonDTO;
if (isPlanned)
{
plannedLessons.Add(lessonInElearningDTO);
}
else
{
clossedLessons.Add(lessonInElearningDTO);
}
}
eLearningSessionDTO.ClossedLessons = clossedLessons;
eLearningSessionDTO.PlannedLessons = plannedLessons;
return eLearningSessionDTO;
}
public eLearningSessions到FilterLearningSession(IEnumerable eLearningSession)
{
var eLearningSessionDTO=新的ElearningSessionsDTO();
var clossedLessons=新列表();
var plannedLessons=新列表();
var groupLessons=eLearningSession.GroupBy(key=>new{key.LessonNumber,key.LessonTitle,key.TargetDate},
data=>new{data.Status,data.EventTitle});
foreach(groupLessons中的var groupLesson)
{
bool isPlanned=false;
var lessonInElearningDTO=新lessonInElearningDTO
{
LessonNumber=groupLesson.Key.LessonNumber,
LessonTitle=groupLesson.Key.LessonTitle,
TargetDate=groupLesson.Key.TargetDate
};
var assignmentsInLessonDTO=新列表();
foreach(groupLesson中的var赋值)
{
var assignmentInLessonDTO=新的AssignmentsInLessonDTO
{
EventTitle=assignment.EventTitle,
状态=分配。状态
};
if(assignment.Status!=(int)eLearningEventSubscriptionStatus.Closed)
{
isPlanned=true;
}
添加(assignmentInLessonDTO)中的assignmentsInLessonDTO;
}
lessonInElearningDTO.LessonsAssignments=Lessondto中的分配;
如果(已计划)
{
计划课程。添加(lessonInElearningDTO);
}
其他的
{
clossedLessons.Add(lessonInElearningDTO);
}
}
eLearningSessionDTO.ClossedLessons=ClossedLessons;
eLearningSessionDTO.PlannedLessons=计划课程;
将在线学习会话返回到;
}
我想为它创建两个单元测试。一个用于验证第一个foreach循环被调用了多少次。第二个用于验证第二个foreach循环被调用了多少次
我使用moq作为我的模拟框架,通常在这种情况下,我会从外部类调用一些传统方法,并使用这些方法,我可以确定该方法在一个循环中被调用了多少次。但在我当前的场景中,我找不到方法来测试这一点
有人能告诉我应该如何进行吗?在代码中没有
for
循环,只有foreach
循环。也似乎是一种奇怪的测试模式,带有这样一个嵌入式逻辑。我的意思是,你想验证foreach
是否真的有效,或者你的代码没有让它失败,或者什么?如果你不能用moq访问它,那么它是你方法的私有实现细节。通过单元测试确定这些私有数字很可能是个坏主意。这是一个内部实现,不应该进行计数/检查。如果重构代码,发现不需要执行两个for循环,该怎么办?即使方法的结果仍然正确,您的测试也会失败。您应该填充IEnumerable
输入参数并断言以查看您的ElearningSessionsDTO
是否按预期填充。正如其他人已经指出的,您的内部实现可能会发生变化,因此将测试与实现细节结合起来是不明智的。