如何测试摘要class?

How to test an abstract class?

我对如何开始测试摘要感到困惑class。

一个例子:

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

Should I not test abstract classes?

在大多数情况下,这是我的选择。

原因 #1:某些 class 从抽象 class 继承的事实是 实现细节 ,而不是 行为。我们不想将测试与实现细节结合起来。

原因 #2:我希望摘要中的代码 class 被涵盖其后代的测试所涵盖。

如果您的设计是新兴的 "test first",那么您已经覆盖了这段代码,因为摘要 class 将是您通过重构 class 引入到您的设计中的东西] 已经在测试中。