Я запутался в том, как начать тестирование абстрактного класса.
Пример:
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());
}
@Matteo обновлено.
Я бы просто расширил абстрактный класс неабстрактным дочерним классом. Таким образом, вы можете затем создать экземпляр класса и протестировать его, как вы тестируете любой другой класс.
@ user2190492, значит, вы имеете в виду, что я должен сосредоточиться только на тестировании поведения унаследованных классов и прекратить тестирование абстрактного класса, как я сделал в своем вопросе?
Класс, наследуемый от вашего абстрактного класса, может быть буквально пустым. Он не изменит и не переопределит какое-либо поведение в абстрактном классе. Я имею в виду дочерний класс, который существует только для того, чтобы создать экземпляр абстрактного класса.






Should I not test abstract classes?
В большинстве случаев это был бы мой выбор.
Причина №1: тот факт, что какой-то класс наследуется от абстрактного класса, является деталь реализации, а не поведение. Мы не хотим связывать наши тесты с деталями реализации.
Причина № 2: я ожидаю, что код в абстрактном классе будет покрыт тестами, которые охватывают его потомков.
Если бы вы создавали дизайн «сначала тестируйте», то у вас уже был бы охват этого кода, потому что абстрактный класс был бы чем-то, что вы вводили бы в свой дизайн посредством рефакторинга класса, который уже тестировался.
абстрактный класс не имеет поля
$params?