Afinogen
@Afinogen
PHP разработчик

PHPUnit как тестировать protected методы?

Доброго времени суток!
Не могу понять 1 момент в тестировании - protected и private методы.

Про их тестирование пишут примерно так

Вообще говоря, тестировать закрытые и защищенные методы - плохая идея. Они не являются частью открытого интерфейса и обычно выполняются через открытые методы класса. Поэтому, когда мы тестируем открытые методы, они неявно тестируют закрытые и защищенные методы.


То есть либо у вас плохая реализация класса, либо тестируйте совместно с публичным.
Но, если у меня публичный метод использует пару методов закрытых, которые формируют, например, различные массивы данных. И нет смысла их светить наружу. Чтобы протестировать оба метода мне нужно формировать огромный тест только для успешного варианта. А так я бы мог протестировать эти методы отдельно и быть уверенными в них. А в публичном методе просто мокировать. Это в разы уменьшает сложность написания и понимания теста.

В стандартной реализации я не нашел варианта для такого тестирования. Есть на stackoverflow
protected static function getMethod($name) {
  $class = new ReflectionClass('MyClass');
  $method = $class->getMethod($name);
  $method->setAccessible(true);
  return $method;
}

public function testFoo() {
  $foo = self::getMethod('foo');
  $obj = new MyClass();
  $foo->invokeArgs($obj, array(...));
  ...
}

На мой взгляд это костыль

Можете пояснить почему не внедрят это в стандартный функционал. Либо как мне правильно писать классы и тесты для таких вариантов?
  • Вопрос задан
  • 1252 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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