Как проверить абстрактный класс? - PullRequest
1 голос
/ 14 мая 2019

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

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

Пример:

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());
}

1 Ответ

1 голос
/ 15 мая 2019

Разве я не должен тестировать абстрактные классы?

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

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

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

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

...