如何测试摘要class?
How to test an abstract class?
我对如何开始测试摘要感到困惑class。
- 我应该测试每个方法吗?
- 我应该测试什么?
- 我不应该测试摘要 classes 吗?
一个例子:
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 引入到您的设计中的东西] 已经在测试中。
我对如何开始测试摘要感到困惑class。
- 我应该测试每个方法吗?
- 我应该测试什么?
- 我不应该测试摘要 classes 吗?
一个例子:
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 引入到您的设计中的东西] 已经在测试中。