17

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

哪个是最佳实践?

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

或者

  • 断言所有属性的相等性
4

3 回答 3

22

我一方面使用自定义断言。主要原因有两个:

  • 不要将测试问题强制投入生产。这意味着equals测试方法中的含义可能与生产代码的含义不一致;
  • 对于所有测试,equals 可能不够好。不同的测试需要不同的断言,所以你最终可能会使用自定义断言。
于 2009-07-24T20:38:39.750 回答
4

如果您正在测试返回值对象(例如,货币值、元组或映射)的方法或函数的返回值,那么检查结果对象是否等于预期的结果对象是有意义的。在这种情况下,equals 的标准实现应该做你想做的事。

同时,如果您在某个对象上调用一个 mutator,然后检查它是否按预期改变了该对象,我认为只检查应该更改的对象的那些属性会更有意义。这可以防止您必须对 equals 进行自定义定义,这无论如何都会掩盖您期望在测试中发生的事情。

于 2009-07-24T22:29:10.837 回答
3

我认为这个问题与标准的做事方式没有任何关系。这是一个思考你的测试应该测试什么的问题。

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

如果要测试整个对象Equals方法的返回值,请改为断言。

于 2009-07-24T21:19:29.917 回答