Раздел вопрос-ответ Как протестировать private static метод в phpunit?

Как протестировать private static метод в phpunit?

Для, примера, у класса-хелпера есть вспомогательный приватный статический метод, к которому не нужен доступ из-вне. Именно этот метод privateStaticMethod и хочется протестировать.

final class Helper_PrivateStatic
{
	public static function method($example)
	{
		return self::privateStaticMethod($example);
	}

	private static function privateStaticMethod($var)
	{
		return $var * 2;
	}
}

Как написать phpunit тест на него?

Например, нужно проверить что передав аргументы 2, 4, 200, результатом функции будет 4, 8, 400.

share

1 ответ

Phpunit тестирование приватных статических методов практически не отличается от тестирования приватных (не статических) методов.

Т.е. используем ReflectionClass, делаем метод публичным и вызываем с помощью invoke. 

На примере, чтобы вызвать приватный статический метод privateStaticMethod из класса Helper_PrivateStatic, можно сделать так:

$class = new ReflectionClass('Helper_PrivateStatic');
$method = $class->getMethod('privateStaticMethod');
$method->setAccessible(true);

$result = $method->invoke('Helper_PrivateStatic', 2);
$this->assertEquals(4, $result);

Создали reflection класс на основе класса Helper_PrivateStatic. Далее получили один из методов класса - privateStaticMethod и сделали его публичным с помощью меода setAccessible. Далее с помощью invoke вызвали этот метод, который раньше являлся приватным статическим.

Тестирование нескольких кейсов с помощью dataProvider:

class Helper_PrivateStaticTest extends PHPUnit_Framework_TestCase
{
	/**
	 * @dataProvider privateStaticMethodProvider
	 */
	public function testPrivateStaticMethod($input, $expectedOutput)
	{
		$class = new ReflectionClass('Helper_PrivateStatic');
		$method = $class->getMethod('privateStaticMethod');
		$method->setAccessible(true);

		$result = $method->invoke('Helper_PrivateStatic', $input);
		$this->assertEquals($expectedOutput, $result);
	}

	public function privateStaticMethodProvider()
	{
		return array(
			array(
				2,
				4,
			),
			array(
				4,
				8
			),
			array(
				200,
				400
			),
		);
	}
}

 

Добавить комментарий
    как минимум 5 символов

    icon Вход в систему

    зарегистрироваться
    НОВЫЕ ПОЛЬЗОВАТЕЛИ