@ganjo888

Как протестировать защищенный метод абстрактного класса?

class Document extends AbstractClass
{
    public function handle($params)
    {
        $requestBody = 'body';
        return $this->request($requestBody);
    }
}

abstract class AbstractClass 
{
    protected function request($body)
    {
  
    }
}


Пробовал так
$class = new ReflectionClass(AbstractClass::class);
$method = $class->getMethod('request');
$method->setAccessible(true);
$document = new Document();
$result =  $method->invoke($document,$params);

Получаю ошибку
TypeError: Argument 2 passed to Illuminate\Log\LogManager::info() must be of the type array, object given, c
  • Вопрос задан
  • 133 просмотра
Решения вопроса 1
@user49981
abstract class AbstractClass
{
    protected function request($body)
    {
        return Document::TEST_VALUE;
    }
}

class Document extends AbstractClass
{
    const TEST_VALUE = 403;

    public function handle($params)
    {
        $requestBody = 'body';
        return $this->request($requestBody);
    }
}

class DocumentTest
{
    public function testRequest()
    {
        $doc = new Document();
        $result = $this->invokeMethod($doc, 'request', [1]);
        self::assertEquals(Document::TEST_VALUE, $result);
    }

    private function invokeMethod(&$object, $methodName, array $parameters = array())
    {
        $reflection = new \ReflectionClass(get_class($object));
        $method = $reflection->getMethod($methodName);
        $method->setAccessible(true);

        return $method->invokeArgs($object, $parameters);
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SerafimArts
@SerafimArts
Junior HTML Developer
Защищённые методы не являются частью публичного интерфейса, а значит их тестирование не подразумевается. Так же как и абстрактные классы не являются самостоятельными сущностями. Себе дороже.
Ответ написан
@oxidmod
1. Тестировать нужно только публичные методы.
2. Тестировать нужно как блек-бокс. Не важно как сделано, важно - что
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы