Верх страницы
Обложка к записи Вызов защищенных и приватных методов
Время для прочтения: 0 мин. 36 сек.

Вызов защищенных и приватных методов

Если вам понадобился данный трюк, то, скорее всего, вы имеете проблему в архитектуре вашего класса/приложения. Его использование — это крайняя мера.

Лучше всего тестировать приватные свойства и методы через публичные методы. Использование данного трюка оправдано в случае экономии времени и при полном понимании зачем вы это делаете.

Пример тестируемого класса:

class Duck {

	private function idea( string $target ) {
		return 'I want to do ' . $target;
	}

}

Чтобы прочитать свойство $private_property на другое, нам поможет ReflectionMethod. Создаем метод run_inaccesible_method:

private function run_inaccesible_method( $object, string $method_name, array $args = [] ) {
	$method = new ReflectionMethod( $object, $method_name );
	$method->setAccessible( true );
	$result = $method->invokeArgs( $object, $args );
	$method->setAccessible( false );

	return $result;
}

Разберем работу метода построчно:

  • С помощью ReflectionMethod получаем в виде объекта метод idea объекта класса Duck;
  • Делаем метод доступным для вызова;
  • Вызываем метод run_inaccesible_method объекта класса Duck с помощью метода invokeArgs;
  • Делаем метод недоступным для вызова;
  • И возвращаем результат.

Пример теста полностью:

use PHPUnit\Framework\TestCase;

class Test_Duck extends TestCase {

	private function run_inaccesible_method( $object, string $method_name, array $args = [] ) {
		$method = new ReflectionMethod( $object, $method_name );
		$method->setAccessible( true );
		$result = $method->invokeArgs( $object, $args );
		$method->setAccessible( false );

		return $result;
	}

	public function test_private_method() {
		$duck = new Duck();
		$this->assertSame(
			'I want to do quack-quack',
			$this->run_inaccesible_method( $duck, 'idea', [ 'quack-quack' ] )
		);
	}

}

Источник: WP Punk.

Автор: Кобзарёв Михаил

Русский разработчик с 20-ти летним стажем. Работаю с PHP, ООП, JavaScript, Git, WordPress, Битрикс, Joomla, Drupal, OpenCart, DLE, Laravel, Moonshine, Symfony, SuiteCRM.

Оптимизирую сайты под Google Page Speed, настраиваю импорты для больших магазинов на WooCommerce + WP All Import. Пишу плагины на заказ. Все мои услуги.

Веду блог о разработке, дайджест в телеграмме и в ВК.

Вы всегда можете нанять меня.

Комментарии
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Предыдущая запись

Давайте дружить
в Telegram

Авторский блог вашего покорного слуги в Telegram про web, программирование, алгоритмы, инструменты разработчика, WordPress, Joomla, Opencart, Laravel, Moonshine, фильмы и сериалы