C# 单元测试:Can';我想不出来?

C# 单元测试:Can';我想不出来?,c#,unit-testing,C#,Unit Testing,我在设计课上做单元测试,项目的外壳交给了我们。在单元测试中,只有一种方法需要添加代码。我无法更改代码中的任何其他内容 我已经尝试了所有我能想到的东西,用我所拥有的C++知识,尝试用不同的方法来解决这个问题。出现的每个结果要么太复杂,因为我没有C#方面的背景,要么没有提供我所寻找的信息 以下是原始代码: class Course { public Course(string id, string title, int creditHours, string description, str

我在设计课上做单元测试,项目的外壳交给了我们。在单元测试中,只有一种方法需要添加代码。我无法更改代码中的任何其他内容

我已经尝试了所有我能想到的东西,用我所拥有的C++知识,尝试用不同的方法来解决这个问题。出现的每个结果要么太复杂,因为我没有C#方面的背景,要么没有提供我所寻找的信息

以下是原始代码:

class Course
{
    public Course(string id, string title, int creditHours, string description, string prerequisiteCourse)
    {
        this.CourseID = id;
        this.CourseTitle = title;
        this.CreditHours = creditHours;
        this.Description = description;
        this.PrerequisiteCourse = prerequisiteCourse;
    }


    public string CourseID;
    public string CourseTitle;
    public int CreditHours;
    public string Description;
    public string PrerequisiteCourse;
}


class CourseListTest
{
    public static void Main(string[] args)
    {
        GetCourseByCourseIDTestWhenCourseExists();
        GetCourseByCourseIDTestWhenCourseDoesNotExist();
    }


    public static void GetCourseByCourseIDTestWhenCourseExists()
    {

        CourseList myCourseList = new CourseList();
        Course myCourse = myCourseList.GetCourseByCourseID("CIS 400");
        if (myCourse.CourseID != "CIS 400")
            System.Console.WriteLine("ERROR - GetCourseByCourseIDTestWhenCourseExists(): Returned CourseID Not equal (CIS 400)");
    }

    public static void GetCourseByCourseIDTestWhenCourseDoesNotExist()
    {

        CourseList myCourseList = new CourseList();
        Course myCourse = myCourseList.GetCourseByCourseID("CIS 101");
        if (myCourse != null)
            System.Console.WriteLine("ERROR - GetCourseByCourseIDTestWhenCourseDoesNotExist(): should have returned null");
    }
}
下面是下节课的问题所在。我们将在GetCourseByCourseID方法中输入代码,这就是我遇到的问题

class CourseList
{
    public Course[] CourseArray = 
        { 
        new Course ("CIS 400", "OO Analysis & Design", 4, "Important class", "CIS 110") ,
        new Course ("CIS 150A" , "VB.NET Programming", 4, "Good Introduction to programming", "CIS 100") ,
        new Course ("CIS 150B", "C# Programming with labs", 4, "Follow-up to CIS 100", "CIS 100")
        };


    public Course GetCourseByCourseID(string id)
    {

    }

}
由于“CIS 101”不是CourseList中的课程,因此必须返回null。整个练习的目的是让控制台不显示任何内容。这意味着代码工作正常


我不想要答案。我只是想举一个例子,说明如何让它发挥作用。因为代码已经给了我们。

最简单的方法是使用
foreach
循环,检查所有课程,直到ID匹配为止。如果没有匹配的ID,循环将退出,您应该返回null


更“高级”的方法是使用LINQ,无论是直接LINQ还是扩展方法,都可以实现相同的结果,但代码更少。

对于任何语言,最好声明一个返回变量,该变量将以失败状态开始。然后尝试查找非故障状态并将其分配给返回变量。如果未找到非故障状态,则不进行赋值,返回值正确为null

例如:

public Course GetCourseByCourseID(string id)
{
    Course foundCourse = null;

    if (CourseArray != null)
    {
       // Check course array here for the id and if one is found, assign to foundCourse.   
    }

    return foundCourse;

}

因此,在if中,您可以继续消除任何可能的故障情况。
if
中的上述选项检查Courserray是否为空。如果为null,它将优雅地退出,并且不会抛出关于尝试检查CourseArray的异常。在可能的情况下,继续做“理智”检查,这会使编程更好。

我将保持接近C++语法。

还有很多其他的方法,但是

public Course GetCourseByCourseID(string id)
{
     for(int x = 0; x < CourseArray.Length; x++)
     {
          if(CourseArray[x].CourseID == id) {return CourseArray[x];}
     }       

     return null;
}
a是每个课程,首先返回结果集合中的第一个元素。这种方法的一个缺点是,如果你有多个课程具有相同的id,你只会得到第一个课程。 但这很可能是一个设计缺陷


应该注意的是,如果
CourseArray
是多维的。那么length将不可用,因为它返回数组所有维度中的元素总数。因此,必须使用System.Linq Count()扩展方法

显然,您必须添加搜索CourseArray的代码,以查看CIS 101是否在其中,如果不在,则返回正确的值。因此,从搜索数组开始。(你需要一个for循环。)如果不知道你尝试了什么,我们就不知道你已经知道了什么。你知道怎么写循环吗?如何访问阵列?除了标记RadioSpace的答案,作为答案,还要投票支持它。他会喜欢的。数组确实有办法获得它们的项目计数,
.Length
@span-DOH!!有趣的是,简单的事情会让人忘记你的第一个示例无法编译,而你的第二个示例在正常情况下会抛出异常。@OmegaMan处理异常取决于操作。但是第一个示例出现了什么错误?@OmegaMan感谢你没有投下否决票并提醒大家。我的DV已经少了。哇,谢谢你们这么快的回复。我本想发布我尝试过的内容,但我一直得到的都是NullRederenceException错误和StackOverFlow错误。我只是完全不知道如何处理它。C的语法似乎有点棘手,但离C++不远。我想也许只有我还在学习这片土地。再次感谢你的帮助!我想我会读更多的C。
using System.Linq;


public Course GetCourseByCourseID(string id)
{
     return CourseArray.Where(a => a.CourseID == id).FirstOrDefault();
}