.Net中的UnitTesting属性?

我正在开发一个我想在开源中发布的lib。 我已经开始为代码编写测试,我想知道我是如何测试.Net对象中的属性的。 可以说我有以下内容:

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 _surname; } set{ _surname = value; } } } 

我有两个与代码相关的问题:

  1. 如何对仅具有getter的Property进行unit testing(在示例中为Name)
  2. 如何使用setter和getter对属性进行unit testing(如示例中的Surname)

我想测试那些简单的属性,因为我已经在其他代码中发现错误,Itellinsense做错了自动完成,并且属性没有返回正确的变量。

更新:

我不是在谈论简单的属性,如示例中的那些,它们确实有一些逻辑,并且很难调试。 编写一个使用setter测试getter的测试,反之亦然,因为如果出现故障,我不知道应该指责哪种方法。 我正在使用属性,因为它们被添加为公共变量,后来需要添加更多逻辑。

如何对仅具有getter的Property进行unit testing(在示例中为Name)

如果你有一个二传手,真的没有测试那么不同。 你只需要找到另一种确定输出的方法。 可以在ctor中,或者对象上的其他setter / operation的结果。

 [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); } 

如果我们有Name和SurName的setter,但只有FullName的getter,那么测试可能如下所示:

 [Test] public void NamePropTest() { Person p = new Person(); p.Name = "Sean"; p.Surname = "Penn"; Assert.AreEqual("Sean Penn", p.FullName); } 

唐痴迷于为吸气者和制定者写傻考试。

另一个测试可能会设置Name,然后获取该属性,这样您就可以获得getter的代码覆盖率。

你应该测试任何面向公众的东西,包括属性。 如果您不测试属性,则可能会冒一些人在其中添加逻辑,从而破坏function的风险。

此外,您不应该依赖它在其他测试中进行测试。 这会使您的测试变得脆弱,并且使得更难以确定问题所在,因为测试将测试不止一件事。

你应该测试属性。 还有自动属性!

unit testing是关于确保程序的更改,不要破坏程序。

您可能最终会在某个时间更改属性实现,并且您希望确保程序仍然按预期工作。 你用你的测试做到了。

即使您使用自动属性(作为字段/成员变量的替代),制作属性的原因也是为了以后您想要更改其实现。 然后你会希望测试在那里。

编辑:(回应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和unit testing之后,一般都是关于避免大多数错误。

如果不小心你写了这个。

 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; } } } 

那你会有一个bug。

测试自动属性可能不太有价值。 但这是另一个问题。

那些属性应该存在,因为你有需要它们的用法。 至于这些应该有unit testing,你应该已经有他们的报道。 如果没有需要它们的场景,它们可能根本就不应该存在。

据我所知,你不应该测试属性(即那些简单的get / set)。

我不确定您使用的是哪种版本的c#。 但是,您可以使用自动属性来避免您遇到的简单的设置/获取问题。

看到这个链接

唐痴迷于为吸气者和制定者写傻考试。

另一个测试可能会设置Name,然后获取该属性,这样您就可以获得getter的代码覆盖率。

我的问题与如何编写测试更相关。 我一直在考虑它,我需要访问私有值,以确保属性按预期工作,否则我不知道如何做到这一点。 https://stackoverflow.com/users/59332/mandel

好的…因为你坚持知道该怎么做….

 [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")); } 

但是,这只有在你有制定者的情况下才有效….

如果你只有吸气剂,那么我只能想到两种可以做到这一点的方法。

  1. 提前知道返回值并断言。
  2. 使用Reflection设置值,然后断言该已知值。

更好的建议是放弃并测试有价值的东西,这些东西实际上为您的软件增加了价值。 测试getter和setter是绝对浪费时间,除非他们背后有复杂的事情……这种情况很少发生。

我认为你的意思是你的getter-only propoerty使用私有字段或其他私人数据。 如果你需要设置它们,唯一的方法是通过Reflection获取它们(参见System.Reflection中的所有(某些)Info类)。 但如果这是一个很好的做法,那就很难讨论。