我的两个问题与此代码有关:
1. 如何对只有getter的属性进行单元测试(例如示例中的Name)? 2. 如何对既有setter又有getter的属性进行单元测试(例如示例中的Surname)?
我希望测试这些简单的属性,因为我已经在其他代码中发现了错误,Intellisense做了错误的自动完成,导致属性没有返回正确的变量。
更新:
如何对只有getter的属性(如示例中的Name)进行单元测试
与测试有setter的属性并没有太大区别,只需要找到另一种确定输出结果的方法。可以在构造函数中或者通过其他setter/对象操作的结果得到。
[Test]
public void NamePropTest()
{
Person p = new Person();
//Some code here that will set up the Person object
// so that you know what the name will be
Assert.AreEqual("some known value...", p.Name);
}
[Test]
public void NamePropTest()
{
Person p = new Person();
p.Name = "Sean";
p.Surname = "Penn";
Assert.AreEqual("Sean Penn", p.FullName);
}
您应该测试属性。也要测试自动属性!
单元测试是为了确保对程序的更改不会破坏该程序。
您可能最终需要更改属性实现,因此您希望通过测试确保程序仍按预期工作。您可以使用测试来做到这一点。
即使您使用自动属性(作为字段/成员变量的替代),将它们设置为属性的原因在于以防以后您想要更改它们的实现。那么您会希望有测试存在。
编辑:(针对shahkalpesh的评论...)
如果您更改了实现,则测试可能还需要更改。因此,我不知道为什么有人要测试简单的get/set?
从这个类开始:
public class TimeOfDay
{
public int Hour{get; private set;}
public int Minute{get; private set;}
public TimeOfDay(int hour, int minute)
{
Hour = hour;
Minute = minute;
}
}
public class TimeOfDay
{
public int _minutesSinceMidnight = 0;
public int Hour
{
get { return _minutesSinceMidnight / 60; }
set { _minutesSinceMidnight = value * 60 + Minutes; }
}
public int Minute
{
get { return _minutesSinceMidnight % 60; }
set { _minutesSinceMidnight = Hour * 60 + value; }
}
public TimeOfDay(int hour, int minute)
{
Hour = hour;
Minute = minute;
}
}
加入一些日期和时间算术函数之类的东西,我希望测试能够表明一切仍然正常...
我认为如果你像之前那样写,应该进行测试。毕竟你可能会打错某些东西。
就像这样简单。
var person = New Person();
person.Surname = "test";
Assert.AreEqual("test", person.Surname);
总的来说,TDD和单元测试都是为了尽可能避免最多的错误。
但如果不小心写成这样。
public class Person{
#region variables
private string _name = String.Empty;
private string _surname = String.Empty;
#region properties
public string Name{
get{
return _name;
}
}
public string Surname{
get{
return _name;
}
set{
_name = value;
}
}
}
如果你没有这样做,那么你可能会有一个错误。
测试自动属性可能不太有价值。但这是另一个问题。
[Test]
TestMethod()
{
Person p = new Person();
p.Name = "a name";
p.Surname = "a surname";
Assert.That(p.Name, Is.EqualTo("a name"));
Assert.That(p.Surname, Is.EqualTo("a surname"));
}
然而,这仅适用于您拥有setter的情况下...
如果您只有getter,则我只能想到两种方法来实现此目的。
更好的建议是放弃测试那些没有实际增加软件价值的getter和setter。除非它们背后有复杂的东西...但这种情况很少见。
这些属性应该存在,因为你有需要它们的用途。至于这些,应该有单元测试,你应该已经对它们进行了覆盖。 如果没有需要它们的情况,它们可能根本不应该存在。
不要浪费时间编写有关getter和setter的愚蠢测试。
另一个测试可能会设置名称,然后获取该属性,以便您可以覆盖getter的代码。
我认为你的只读属性使用了私有字段或其他私有数据。如果你需要设置它们,唯一的方法是通过反射获取它们(请参阅System.Reflection中的所有(something)Info类)。但是这是否是一个好的实践存在争议。