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

Если вы можете использовать синтаксис SQL - скажем, если вы используете LINQ для доступа к полям структуры или массива или напрямую обращаетесь к базе данных с таблицей «Алфавит» только с одним полем «Письмо», вы может адаптировать следующий код:

SELECT A.Letter, B.Letter, C.Letter
FROM Alphabet AS A, Alphabet AS B, Alphabet AS C
WHERE A.Letter<>B.Letter AND A.Letter<>C.Letter AND B.Letter<>C.Letter
AND A.Letter<B.Letter AND B.Letter<C.Letter

Это вернет все комбинации из 3 букв, несмотря на то, сколько букв у вас в таблице «Алфавит» (это может быть 3, 8, 10, 27 и т. д.). .

Если все, что вы хотите, это все перестановки, а не комбинации (т. е. вы хотите, чтобы «ACB» и «ABC» считались разными, а не отображались только один раз) просто удалите последнюю строку (AND ) и это сделано.

Post-Edit: после повторного чтения вопроса я понимаю, что необходим алгоритм general , а не только определенный для случая выбора 3 Предметы. Ответ Адама Хьюза - полный, к сожалению, я не могу его проголосовать (пока). Этот ответ прост, но работает только тогда, когда вы хотите точно 3 элемента.

16
задан spinodal 28 July 2009 в 17:54
поделиться

3 ответа

I для одного использования пользовательские утверждения. Есть две основные причины:

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

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

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

4
ответ дан 30 November 2019 в 12:51
поделиться

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

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

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

3
ответ дан 30 November 2019 в 12:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: