题
我该如何测试的具体方法的一个抽象的类进行?
我期望,我们必须建立某种对象的一部分测试。虽然,我没有想法的最佳做法,为此,或者如果允许进行。
解决方案
单元的测试抽象的课程并不意味着测试的接口,作为抽象的课程能有具体的方法,这种具体的方法可以进行测试。
它不是那么少见,在编写一些图书馆的代码,有某些基类,你希望延长在应用层。如果你想要的,以确保图书馆的代码进行测试,你需要意味着要UT的具体方法的抽象的课程。
就个人而言,我使用进行,并且它具有所谓的存根和模拟对象,以帮助你的测试这样的事情。
直接从 进行手册:
abstract class AbstractClass
{
public function concreteMethod()
{
return $this->abstractMethod();
}
public abstract function abstractMethod();
}
class AbstractClassTest extends PHPUnit_Framework_TestCase
{
public function testConcreteMethod()
{
$stub = $this->getMockForAbstractClass('AbstractClass');
$stub->expects($this->any())
->method('abstractMethod')
->will($this->returnValue(TRUE));
$this->assertTrue($stub->concreteMethod());
}
}
嘲笑对象给你几件事情:
- 你是不是需要有具体的执行情况摘要类,并且可以摆脱短线代替
- 你可以打电话给具体的方法,并断言,他们正确地执行
- 如果具体的方法依赖于没有得到执行(摘要)的方法,你可能短的回报价值有会()进行方法
其他提示
这是一个很好的问题。我一直在寻找这个。
幸运的是,PHPUnit已经有了 这种情况的getMockForAbstractClass()
方法,例如
protected function setUp()
{
$stub = $this->getMockForAbstractClass('Some_Abstract_Class');
$this->_object = $stub;
}
重要:
请注意,这需要PHPUnit> 3.5.4。以前版本中有错误。
要升级到最新版本:
sudo pear channel-update pear.phpunit.de
sudo pear upgrade phpunit/PHPUnit
应该注意的是,从PHP 7开始支持匿名课程已被添加。这为您为抽象类设置测试提供了额外的途径,该抽象类不依赖于PHPUnit特定的功能。
class AbstractClassTest extends \PHPUnit_Framework_TestCase
{
/**
* @var AbstractClass
*/
private $testedClass;
public function setUp()
{
$this->testedClass = new class extends AbstractClass {
protected function abstractMethod()
{
// Put a barebones implementation here
}
};
}
// Put your tests here
}
Eran,你的方法应该有效,但它违背了在实际代码之前编写测试的倾向。
我建议将测试编写在有问题的抽象类的非抽象子类的所需功能上,然后编写抽象类和实现子类,最后运行测试。
您的测试显然应该测试抽象类的已定义方法,但总是通过子类测试。
尼尔森的回答是错误的。
抽象类不要求所有方法都是抽象的。
实施的方法是我们需要测试的方法。
你可以做的是在单元测试文件上创建一个虚假的存根类,让它扩展抽象类,然后只实现所需的功能,当然,并测试它。
干杯。
如果您不想将抽象类子类化为仅对已在抽象类中实现的方法执行单元测试,您可以尝试查看您的框架是否允许您模拟抽象类。
不隶属于 StackOverflow