Следует ли переопределить метод equals для утверждения равенства объекта в unit test?

Скажем, мы тестируем результат метода, утверждая равенство всех свойств объекта результата со свойствами ожидаемого объекта результата. Если мы реализуем метод equals и используем Assert.AreEqual(expectedResult, actualResult)... Но equals может означать что-то другое в производственном коде.

Какая практика?

  • Утверждение равенства объектов с помощью метода overriden equals

или

  • Утверждение равенства всех свойств

Ответы

Ответ 1

I для использования пользовательских утверждений. Существуют две основные причины:

  • не вызывают проблем с тестированием. Это означает, что значение equals в методе тестирования может не совпадать со значением для производственного кода;
  • equals могут быть недостаточно хороши для всех тестов. Различные тесты потребуют разных утверждений, поэтому вы, вероятно, в конечном итоге будете использовать пользовательские утверждения.

Ответ 2

Если вы проверяете возвращаемое значение метода или функции, которая возвращает объект значения (например, значение валюты или кортеж или карту), тогда имеет смысл проверить, что объект результата равен ожидаемому объект результата. В этом случае стандартная реализация equals должна делать то, что вы хотите.

Между тем, если вы вызываете мутатор на каком-либо объекте, а затем проверяете, что он мутировал объект, как ожидалось, я думаю, что было бы разумнее проверять только те свойства объектов, которые должны были быть изменены. Это не позволяет вам сделать собственное определение равных, которое в любом случае заслонит то, что вы ожидали в ходе теста.

Ответ 3

Я не думаю, что этот вопрос имеет отношение к стандартному способу делать вещи. Это вопрос о том, что ваш тест должен тестировать.

Если вы хотите проверить, что все свойства равны, утвердите равенство всех свойств.

Если вы хотите проверить возвращаемое значение всего объекта Equals, верьте, что вместо этого.