代码之家  ›  专栏  ›  技术社区  ›  Nick Larsen

单元测试值对象

  •  2
  • Nick Larsen  · 技术社区  · 14 年前

    是否有必要对一个值对象进行单元测试,您将如何进行呢?

    以该对象为例:

    public class TeamProfile
    {
        public string Name { get; set; }
    
        public int Wins { get; set; }
        public int Losses { get; set; }
        public int Draws { get; set; }
    }
    
    6 回复  |  直到 12 年前
        1
  •  3
  •   hol    14 年前

    答案是一种意见。我会说不,但这些问题在日常工作中确实会出现,我理解这个问题,所以让我给出更多的意见:

    我会根据具体情况来判断。如果你认为“我的单元测试例行程序可以全部测试”(并依赖于它),并且你看到上述例行程序有任何可能会转向更复杂的东西,那么答案是肯定的。像这样的问题,我有时会回答“是”,但过了一段时间后才发现它实在是太过分了。然后在其他场合,我判断“哦,不,这真是太过分了”,后来才发现有一个方面我从来没有想过。

    如何测试它?和所有测试用例一样:定义输入和预期结果。设置它。了解了。检查GET是否是您设置的。

        2
  •  2
  •   kander    14 年前

    我不认为这本身是“必要的”,但它确实保护了您,以防您在某个时刻向设置器添加逻辑(例如:当尝试负赢/负输/平局时抛出异常,因为您不使用无符号整数)。

    如何测试它?简单:调用setter、调用getter、验证该值是否为您存储的值,或者是否引发了您期望的异常。

        3
  •  1
  •   mdma    14 年前

    我将测试的功能不仅仅是简单的get/set。例如,值对象应该重写equals和gethashcode。

    如果您将单元测试看作一个编码的功能规范,那么它可以帮助您思考所需的测试。(如果您真的有一个功能规范,那么这是一个确定单元测试的好来源。)

        4
  •  1
  •   James    13 年前

    丹伯格约翰森有一篇关于价值对象及其介绍和测试的优秀文章 http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson

    为了清楚起见,我必须重申,给出的示例是 一个值对象。 http://martinfowler.com/bliki/ValueObject.html

    具体来说,它要么是命令、消息,要么更像是(DTO)数据传输对象。 正如其他人提到的,提供的类没有要测试的行为。

        5
  •  0
  •   abyx    14 年前

    这是可以做到的,但在我看来完全没用。
    值对象绝对不包含逻辑,因此测试它们是浪费的工作(如果您的值对象被破坏了,那么几乎所有其他的测试都将被破坏,前提是您从不嘲笑它们)。

        6
  •  0
  •   Tim Cooper    12 年前

    我不测试短样式属性。后面的代码是由编译器自动生成的,所以我不明白为什么要测试它们。

    只需记住添加 丢失的 更改排序签名后立即测试。