2009-07-24 37 views
13

假设我们通过断言结果对象的所有属性与预期结果对象的属性相等来测试方法的结果。我们是否应该实现equals方法并使用Assert.AreEqual(expectedResult,actualResult)...但是equals可能意味着生产代码中有些不同。是否应该覆盖等于在单元测试中声明对象相等的方法?

哪个是最佳做法?

  • 断言的对象的通过重写等式equals方法

  • 断言所有属性

回答

18

我一个使用定制断言的平等。主要有两个原因:

  • 不要强迫测试考虑到生产中。这意味着在测试方法中equals的含义可能与生产代码的含义不一致;
  • 等于可能对所有测试都不够好。不同的测试需要不同的断言,因此无论如何你最终可能会使用自定义断言。
+0

我认为你是对的,但如果被测对象的属性在测试中不可访问,该怎么办。使用反射? – 2015-01-22 11:33:52

3

我不认为这个问题与标准的做事方式有关。这是考虑你的测试应该进行测试的问题。

如果要测试所有属性是否相等,请声明所有属性相等。

如果要测试整个对象的方法的返回值,请声明该方法。

+0

+1非常简单但绝对准确! – 2012-11-09 14:59:48

4

如果您正在测试返回值对象(例如货币值或元组或映射)的方法或函数的返回值,那么检查结果对象是否等于预期的结果对象。在这种情况下,equals的标准实现应该做你想要的。同时,如果你在某个对象上调用了一个增变器,然后检查它是否如预期的那样改变了该对象,我认为只检查那些应该改变的对象的属性会更有意义。这样可以防止您必须对等值进行自定义定义,无论如何都会掩盖您期望在测试中发生的情况。