Исправлять ли Ошибки в Приватных Методах, Если Они Компенсируют Друг Друга?
Недавно наткнулся на интересное обсуждение. Нужно ли исправлять ошибки, которые компенсируют друг друга и в итоге приводят к правильному поведению?
Допустим, у нас есть такой код:
public void PerformAction()Допустим, что и
{
Step1();
Step2();
}
private void Step1()
{ ... }
private void Step2()
{ ... }
Step1, и Step2 содержат ошибки в своей реализации, но общее поведение метода PerformAction является правильным, потому что по чистой случайности ошибки в двух приватных методах взаимно компенсируются.Как следует тестировать этот метод? Общее мнение, что вам следует тестировать только публичные методы. Приватные методы следует тестировать косвенно, через публичные методы, которые их используют.
Другими словами,
PerformAction - единственный метод, который здесь следует тестировать. Step1 и Step2 вообще не должны рассматриваться.Но разве этот совет не заставляет вас игнорировать ошибки в
Step1 и Step2, поскольку поведение PerformAction остаётся правильным? Это отличный вопрос, и чтобы ответить на него, нам нужно ещё раз обсудить разницу между «наблюдаемым поведением» и «деталями реализации».В нашем примере метод
PerformAction - это наблюдаемое поведение, а Step1 и Step2 - детали реализации. Поэтому единственное, что имеет значение, - это поведение PerformAction.Клиентов
PerformAction не волнует, как именно этот метод выполняет свою функцию. Единственное, что их волнует, - это конечный результат - его наблюдаемое поведение. Модульные тесты всегда должны имитировать клиентов тестируемого кода и, следовательно, не должны заботиться о двух приватных методах.Так что да, этот совет потенциально может привести к незамеченным ошибкам в приватных методах. Но нет, это не проблема, потому что эти ошибки никогда не проявятся. Если только приватные методы не используются где-либо ещё, и там ошибка проявляется в публичных методах. Но тогда она должна быть обнаружена тестами тех публичных методов.
Я бы даже сказал, что это вовсе не ошибки, потому что клиенты вашего приложения не могут с ними столкнуться. Как говорится, если в лесу упало дерево и никто этого не услышал, можно ли считать, что оно упало беззвучно?
Однако, если бы эти методы не были приватными, всё было бы по-другому. Теперь, когда эти методы являются частью общедоступного API, они также становятся частью наблюдаемого поведения и, следовательно, должны быть протестированы и исправлены. Но до тех пор ошибки в приватных методах - не проблема.
Конечно, если вы заметили ошибки в приватных методах
Step1 и Step2, лучше всего исправить их независимо от того, заметны ли они, чтобы избежать путаницы для будущих читателей этих методов.Но это «исправление» будет рефакторингом, а не исправлением ошибки: здесь вы меняете детали реализации; наблюдаемое поведение остаётся неизменным.
Источник: https://enterprisecraftsmanship.com/
Автор Оригинала: Владимир Хориков