Php 如何测试抽象类?

Php 如何测试抽象类?,php,phpunit,tdd,Php,Phpunit,Tdd,我对如何开始测试抽象类感到困惑 我应该测试每种方法吗 我应该测试什么 我不应该测试抽象类吗 例如: 抽象类命令 { 私人$params; 具有(数组$params=[])的公共函数 { $this->params=$params; } 公共函数getParams() { 返回$this->params; } 抽象公共函数run(); } 我应该像这样测试它: /**@测试*/ 公共函数是一个抽象类() { $command=$this->getReflectionClass(); $thi

我对如何开始测试抽象类感到困惑

  • 我应该测试每种方法吗
  • 我应该测试什么
  • 我不应该测试抽象类吗
例如:

抽象类命令
{
私人$params;
具有(数组$params=[])的公共函数
{
$this->params=$params;
}
公共函数getParams()
{
返回$this->params;
}
抽象公共函数run();
}
我应该像这样测试它:

/**@测试*/
公共函数是一个抽象类()
{
$command=$this->getReflectionClass();
$this->assertTrue($command->isastract());
}
/**@测试*/
公共函数有一个运行方法()
{
$command=$this->getReflectionClass();
$method=$this->getReflectionMethod('run');
$this->assertTrue($command->hastmethod('run'));
$this->assertTrue($method->isastract());
$this->assertTrue($method->isPublic());
$this->assertEquals(0,$method->getNumberOfParameters());
}
我不应该测试抽象类吗

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

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

原因2:我希望抽象类中的代码会被覆盖其子类的测试所覆盖


如果您设计的是新兴的“测试优先”,那么您已经有了此代码的覆盖范围,因为抽象类将是通过重构已在测试中的类而引入设计的东西。

抽象类没有
$params
字段?@Matteo更新。我只会通过非抽象子类扩展抽象类。这样,您就可以实例化该类并像测试任何其他类一样对其进行测试。@user2190492那么您的意思是我应该只专注于测试继承类的行为,而停止像我在问题中所做的那样测试抽象类?从您的抽象类继承的类可以是空的。它不会更改或重写抽象类中的任何行为。我的意思是,子类的存在只是为了使抽象类可以实例化。