Как протестировать абстрактный класс?

Я запутался в том, как начать тестирование абстрактного класса.

  • Должен ли я тестировать каждый метод?
  • Что я должен проверить?
  • Должен ли я не тестировать абстрактные классы?

Пример:

abstract class Command
{
    private $params;

    public function with(array $params = [])
    {
        $this->params = $params;
    }

    public function getParams()
    {
        return $this->params;
    }

    abstract public function run();
}

Должен ли я проверить это как:

/** @test */
public function is_an_abstract_class()
{
    $command = $this->getReflectionClass();
    $this->assertTrue($command->isAbstract());
}

/** @test */
public function has_an_run_method()
{
    $command = $this->getReflectionClass();
    $method = $this->getReflectionMethod('run');

    $this->assertTrue($command->hasMethod('run'));
    $this->assertTrue($method->isAbstract());
    $this->assertTrue($method->isPublic());
    $this->assertEquals(0, $method->getNumberOfParameters());
}

абстрактный класс не имеет поля $params?

Matteo 14.05.2019 21:07

@Matteo обновлено.

rook99 14.05.2019 21:16

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

user2190492 14.05.2019 21:26

@ user2190492, значит, вы имеете в виду, что я должен сосредоточиться только на тестировании поведения унаследованных классов и прекратить тестирование абстрактного класса, как я сделал в своем вопросе?

rook99 14.05.2019 21:32

Класс, наследуемый от вашего абстрактного класса, может быть буквально пустым. Он не изменит и не переопределит какое-либо поведение в абстрактном классе. Я имею в виду дочерний класс, который существует только для того, чтобы создать экземпляр абстрактного класса.

user2190492 14.05.2019 21:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Should I not test abstract classes?

В большинстве случаев это был бы мой выбор.

Причина №1: тот факт, что какой-то класс наследуется от абстрактного класса, является деталь реализации, а не поведение. Мы не хотим связывать наши тесты с деталями реализации.

Причина № 2: я ожидаю, что код в абстрактном классе будет покрыт тестами, которые охватывают его потомков.

Если бы вы создавали дизайн «сначала тестируйте», то у вас уже был бы охват этого кода, потому что абстрактный класс был бы чем-то, что вы вводили бы в свой дизайн посредством рефакторинга класса, который уже тестировался.

Другие вопросы по теме