Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于测试用例定义类_C#_Unit Testing_C# 4.0 - Fatal编程技术网

C# 基于测试用例定义类

C# 基于测试用例定义类,c#,unit-testing,c#-4.0,C#,Unit Testing,C# 4.0,有人能告诉我如何定义班级学生,从而满足最后一个测试用例吗。 我无法理解上一个函数GetId()的方法实现是如何实现的 谢谢我从评论中了解到您正在进行一些测试驱动开发(TDD)练习,并且您在理解这个示例时遇到了困难。考虑到这一点,以下是我的看法: 测试中发生的第一件事是,当您创建Student的实例时,它被分配给类型为User的变量。这可能有不同的方法,但最明显的解释是,User是基类,Student继承User 接下来的两条语句直接调用student变量上的方法。由于此变量的类型为User,因此

有人能告诉我如何定义班级学生,从而满足最后一个测试用例吗。 我无法理解上一个函数GetId()的方法实现是如何实现的


谢谢

我从评论中了解到您正在进行一些测试驱动开发(TDD)练习,并且您在理解这个示例时遇到了困难。考虑到这一点,以下是我的看法:

  • 测试中发生的第一件事是,当您创建
    Student
    的实例时,它被分配给类型为
    User
    的变量。这可能有不同的方法,但最明显的解释是,
    User
    是基类,
    Student
    继承
    User
  • 接下来的两条语句直接调用
    student
    变量上的方法。由于此变量的类型为
    User
    ,因此这些方法必须存在于
    User
    类中。同样,有多种方法可以实际工作,但最简单的方法是假设这些方法需要返回的值实际上存储在
    User
    类中
  • 这两点将我们引向一个
    User
    类,它看起来像这样:

    class User
    {
        private readonly string _name;
        private readonly int _id;
    
        public User(string name, int id)
        {
            _name = name;
            _id = id;
        }
    
        public string GetName() { return _name; }
        public int GetId() { return _id; }
    }
    
    上述方法确保了当我们通过类型为
    User
    的变量查看对象实例时,我们仍然可以调用
    GetName()
    GetId()
    方法,并返回我们期望的值

    现在我们来进行该方法的第三个也是最后一个测试。请注意,在调用方法之前,此测试将
    student
    变量强制转换为类
    student
    。还请注意,此方法应返回
    studentId
    中的值,而不是
    basicId
    中的值,后者是基类的
    GetId()
    方法应返回的值

    因此,我们有相同的方法名,在相同的对象实例上使用,但根据对象的编译时类型(也称为“静态类型”),其行为应该有所不同。这与运行时类型相反,运行时类型是对象的实际类型

    有鉴于此,我们必须在
    Student
    类中声明一个新的
    GetId()
    方法,当然还要提供一种方法让它返回在对象初始化期间使用的不同ID值:

    class Student : User
    {
        private readonly int _id;
    
        public Student(string name, int basicId, int studentId)
            : base(name, basicId)
        {
            _id = studentId;
        }
    
        public new int GetId() { return _id; }
    }
    
    一个问题是,假设我们已经知道
    User
    类有一个同名的方法,那么您将使用新的
    GetId()
    方法隐藏该类的方法。因此,需要使用
    new
    关键字来避免任何编译时警告

    我个人的偏好是永远避免方法隐藏。它几乎总是错误的设计选择,只有在某些外部需求迫使它时才应该使用


    (请注意,上述类中的字段标记为
    readonly
    。测试中没有要求这种情况,但测试中也没有任何内容阻止这种情况发生。我的首选是将字段设置为
    readonly
    ,除非它们不能设置为只读,因此这里使用
    readonly
    ).

    我从评论中了解到,您正在进行一些测试驱动开发(TDD)练习,并且您在理解此示例时遇到困难。考虑到这一点,以下是我的看法:

  • 测试中发生的第一件事是,当您创建
    Student
    的实例时,它被分配给类型为
    User
    的变量。这可能有不同的方法,但最明显的解释是,
    User
    是基类,
    Student
    继承
    User
  • 接下来的两条语句直接调用
    student
    变量上的方法。由于此变量的类型为
    User
    ,因此这些方法必须存在于
    User
    类中。同样,有多种方法可以实际工作,但最简单的方法是假设这些方法需要返回的值实际上存储在
    User
    类中
  • 这两点将我们引向一个
    User
    类,它看起来像这样:

    class User
    {
        private readonly string _name;
        private readonly int _id;
    
        public User(string name, int id)
        {
            _name = name;
            _id = id;
        }
    
        public string GetName() { return _name; }
        public int GetId() { return _id; }
    }
    
    上述方法确保了当我们通过类型为
    User
    的变量查看对象实例时,我们仍然可以调用
    GetName()
    GetId()
    方法,并返回我们期望的值

    现在我们来进行该方法的第三个也是最后一个测试。请注意,在调用方法之前,此测试将
    student
    变量强制转换为类
    student
    。还请注意,此方法应返回
    studentId
    中的值,而不是
    basicId
    中的值,后者是基类的
    GetId()
    方法应返回的值

    因此,我们有相同的方法名,在相同的对象实例上使用,但根据对象的编译时类型(也称为“静态类型”),其行为应该有所不同。这与运行时类型相反,运行时类型是对象的实际类型

    有鉴于此,我们必须在
    Student
    类中声明一个新的
    GetId()
    方法,当然还要提供一种方法让它返回在对象初始化期间使用的不同ID值:

    class Student : User
    {
        private readonly int _id;
    
        public Student(string name, int basicId, int studentId)
            : base(name, basicId)
        {
            _id = studentId;
        }
    
        public new int GetId() { return _id; }
    }
    
    一个问题是,假设我们已经知道
    User
    类有一个同名的方法,那么您将使用新的
    GetId()
    方法隐藏该类的方法。因此,需要使用
    new
    关键字来避免任何编译时警告

    我个人的偏好是永远避免方法隐藏。它几乎总是错误的设计选择,只有在某些外部需求迫使它时才应该使用

    (请注意,上述类别中的字段标记为
    r。)