C# 测试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

嗨,我有一个方法,它有两个for循环。该方法如下所示:

 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
是否按预期填充。正如其他人已经指出的,您的内部实现可能会发生变化,因此将测试与实现细节结合起来是不明智的。