C# 如何在对象类中对字符串值进行单元测试

C# 如何在对象类中对字符串值进行单元测试,c#,unit-testing,C#,Unit Testing,我试图对一个对象类进行单元测试,该对象类使用get/set保存其中的值 我知道你会如何测试数字计算 但是在没有像x+y这样的测试方法的情况下,如何测试get/set呢 这是我需要测试的类: 公车 { //用于保存每个序列详细信息的变量。必要时对特定入口使用不同的数据类型。 私有字符串_trainID; 私人字符串(u)离开;; 专用字符串\u目的地; 私有字符串_类型; 私有字符串_interStop; 私人时间span\u出发时间; 私人字符串(离开日);; 斯莱珀伯斯私人酒店; 一等兵; /

我试图对一个对象类进行单元测试,该对象类使用get/set保存其中的值

我知道你会如何测试数字计算

但是在没有像x+y这样的测试方法的情况下,如何测试get/set呢

这是我需要测试的类:

公车
{
//用于保存每个序列详细信息的变量。必要时对特定入口使用不同的数据类型。
私有字符串_trainID;
私人字符串(u)离开;;
专用字符串\u目的地;
私有字符串_类型;
私有字符串_interStop;
私人时间span\u出发时间;
私人字符串(离开日);;
斯莱珀伯斯私人酒店;
一等兵;
//获取/设置设置列车ID值。
公共字符串序列号
{
获取{return\u trainID;}
设置{u trainID=value;}
}
//获取/设置用于设置离开值。
公共字符串离开
{
获取{return}
设置{u=value;}
}
//获取/设置设置目标值。
公共字符串目的地
{
获取{return\u destination;}
设置{u destination=value;}
}
//获取/设置设置类型值。
公共字符串类型
{
获取{return\u type;}
设置{u type=value;}
}
//获取/设置设置中间停止值。
公共字符串中间表
{
获取{return\u interStop;}
设置{u interStop=value;}
}
//获取/设置设置出发时间值。
公共时间跨度出发时间
{
获取{return\u departureTime;}
设置{u departureTime=value;}
}
//获取/设置设置出发日期值。
公共字符串发布日
{
获取{return\u departureDay;}
设置{u departureDay=value;}
}
//获取/设置设置轨枕泊位值。
公共布尔斯莱伯斯酒店
{
获取{return\u sleeperBerth;}
设置{u sleeperBerth=value;}
}
//获取/设置用于设置第一类值。
公共学校头等舱
{
获取{return\u firstClass;}
设置{u firstClass=value;}
}
}
我还编写了某种单元测试,我认为它是正确的,但它只是失败了。有人能告诉我怎么做吗

这是我做的测试(真的这么简单吗?)

TrainTest
{
[测试类]
公共类UnitTest1
{
[测试方法]
public void TestTrainID()
{
列车=新列车();
字符串id=“1S45”;
train.TrainID=“1S45”;
断言.AreEqual(id,train.TrainID);
}
}
}

您应该测试由行为引起的行为和状态更改。您的类没有行为,也没有行为的状态更改。没有什么可测试的

一个有效的测试是,当您的类具有一个设置支持字段的构造函数,然后断言属性公开支持字段中的值时

失败的测试将指出构造函数中的错误

因此,假设您的类有一个类似的构造函数(仅出于演示目的而简化)

请参阅下面的测试示例,该测试可用于确认构造函数的行为是否符合预期

公共类列车单元测试
{
[事实]
public void应获得TrainID()
{
//安排
var expected=“1S45”;
var主体=新列车(“1S45”);
//表演
字符串实际值=subject.TrainID;
//断言
断言。相等(预期、实际);
}
}

你在浪费时间重新发明轮子。

将您的属性替换为,并且,突然之间您不需要对getter和setter进行单元测试,因为编译器会创建所有getter/setter代码并确保其正确性:

public class Train
{
    public string TrainID { get; set; }
    public string Departure { get; set; }
    ... etc. ...
}

(因为您提到这是一个“玩具示例”,旨在让您开始单元测试:是的,您提出的测试很好。)

除了语法语义之外,除非代码中没有显示实际错误,正如您提到的,这是一个玩具示例,或者传递给测试的值有误,导致caparison错误,提供的测试应按书面要求通过

大多数情况下,在安排和实施测试时,构建测试流程有助于避免简单错误

[TestClass]
public class TrainUnitTest
{
    [TestMethod]
    public void Should_Get_TrainID() {
        //Arrange
        string expected = "1S45";
        Train subject = new Train();
        subject.TrainID = expected;

        //Act
        string actual = subject.TrainID;

        //Assert
        Assert.AreEqual(expected, actual);
    }
}
上述失败的可能性现在缩小了问题的范围,使被测对象处于错误状态


Reference

@Kris:我不同意:没有必要对自动化属性的setter或getter进行单元测试。Roslyn开发人员负责单元测试,我不是这么说的。我是说,没有必要测试没有行为和/或状态更改的类。你是说当使用自动实现的属性时,必须编写单元测试的要求神奇地消失了,这是不正确的。@Kris:你实际上是在鼓吹语言功能需要进行单元测试,这显然是荒谬的说法。代码不应猜测构建它的框架(或语言)。@Esuth如果您的教授要求您测试getter/setter,无论是否使用自动实现的属性,那么您编写和发布的代码正是您所需要的。就是这么简单。@Flater操作发布一个包含属性和支持字段的类。如果有一个构造函数设置支持字段,那么是的,测试公共属性是否公开支持字段上设置的值是正确的。在“真实世界”应用程序中,不需要这样做-您可以使用自动实现的属性,而无需进行单元测试。您的教授可能会将此作为一个教学练习,让您习惯单元测试,也可能是一个机会,让您了解编译器如何处理自动实现的属性。如果下一节课他/她没有解释什么是自动实现的属性
[TestClass]
public class TrainUnitTest
{
    [TestMethod]
    public void Should_Get_TrainID() {
        //Arrange
        string expected = "1S45";
        Train subject = new Train();
        subject.TrainID = expected;

        //Act
        string actual = subject.TrainID;

        //Assert
        Assert.AreEqual(expected, actual);
    }
}