Следует ли переопределить метод equals для утверждения равенства объекта в unit test?
Скажем, мы тестируем результат метода, утверждая равенство всех свойств объекта результата со свойствами ожидаемого объекта результата. Если мы реализуем метод equals и используем Assert.AreEqual(expectedResult, actualResult)... Но equals может означать что-то другое в производственном коде.
Какая практика?
- Утверждение равенства объектов с помощью метода overriden equals
или
- Утверждение равенства всех свойств
Ответы
Ответ 1
I для использования пользовательских утверждений. Существуют две основные причины:
- не вызывают проблем с тестированием. Это означает, что значение
equals
в методе тестирования может не совпадать со значением для производственного кода;
- equals могут быть недостаточно хороши для всех тестов. Различные тесты потребуют разных утверждений, поэтому вы, вероятно, в конечном итоге будете использовать пользовательские утверждения.
Ответ 2
Если вы проверяете возвращаемое значение метода или функции, которая возвращает объект значения (например, значение валюты или кортеж или карту), тогда имеет смысл проверить, что объект результата равен ожидаемому объект результата. В этом случае стандартная реализация equals должна делать то, что вы хотите.
Между тем, если вы вызываете мутатор на каком-либо объекте, а затем проверяете, что он мутировал объект, как ожидалось, я думаю, что было бы разумнее проверять только те свойства объектов, которые должны были быть изменены. Это не позволяет вам сделать собственное определение равных, которое в любом случае заслонит то, что вы ожидали в ходе теста.
Ответ 3
Я не думаю, что этот вопрос имеет отношение к стандартному способу делать вещи. Это вопрос о том, что ваш тест должен тестировать.
Если вы хотите проверить, что все свойства равны, утвердите равенство всех свойств.
Если вы хотите проверить возвращаемое значение всего объекта Equals
, верьте, что вместо этого.