Unit testing 测试抽象类
如何使用PHPUnit测试抽象类的具体方法Unit testing 测试抽象类,unit-testing,phpunit,abstract-class,Unit Testing,Phpunit,Abstract Class,如何使用PHPUnit测试抽象类的具体方法 我希望我必须创建某种对象作为测试的一部分。虽然,我不知道这方面的最佳实践,或者PHPUnit是否允许这样做。Eran,您的方法应该可以工作,但它违背了在实际代码之前编写测试的趋势 我的建议是,对所讨论的抽象类的非抽象子类的所需功能编写测试,然后编写抽象类和实现子类,最后运行测试 显然,您的测试应该测试抽象类的已定义方法,但始终通过子类进行测试。如果您不想对抽象类进行子类化,只是为了对已经在抽象类中实现的方法执行单元测试,您可以尝试查看您的框架是否允许抽
我希望我必须创建某种对象作为测试的一部分。虽然,我不知道这方面的最佳实践,或者PHPUnit是否允许这样做。Eran,您的方法应该可以工作,但它违背了在实际代码之前编写测试的趋势 我的建议是,对所讨论的抽象类的非抽象子类的所需功能编写测试,然后编写抽象类和实现子类,最后运行测试
显然,您的测试应该测试抽象类的已定义方法,但始终通过子类进行测试。如果您不想对抽象类进行子类化,只是为了对已经在抽象类中实现的方法执行单元测试,您可以尝试查看您的框架是否允许抽象类。Nelson的答案是错误的 抽象类并不要求所有的方法都是抽象的 我们需要测试实现的方法 您可以做的是在单元测试文件上创建一个伪存根类,让它扩展抽象类,并只实现所需的,当然没有任何功能,然后测试它
干杯。抽象类的单元测试并不意味着测试接口,因为抽象类可以有具体的方法,而这些具体的方法可以测试 在编写一些库代码时,希望在应用程序层中扩展某些基类,这种情况并不少见。如果您想确保库代码经过测试,您需要了解抽象类的具体方法 就我个人而言,我使用PHPUnit,它有所谓的存根和模拟对象来帮助您测试这类东西 直接来自: 模拟对象为您提供了以下几点:
- 您不需要有抽象类的具体实现,而可以使用存根
- 您可以调用具体的方法并断言它们执行正确
- 如果具体方法依赖于未实现(抽象)方法,则可以使用will()PHPUnit方法存根返回值
这是个好问题。我也一直在找这个。
幸运的是,PHPUnit已经有了处理这种情况的方法,例如
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
应该注意的是,从PHP7开始,已经添加了对的支持。这为您提供了为抽象类设置测试的额外途径,该类不依赖于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
}
也许你应该考虑改变接受的答案。也许会有帮助。听起来很有趣,但你会测试模拟?测试是什么样的?IE:在测试用例中扩展模拟并针对扩展的测试类进行测试?我发现一个任意的答案是:您有一个抽象类“A”,它有一个公共的“foo()”方法。此“foo()”方法在所有“B”类和“C”类中都使用,这两个类都派生自“A”。您会选择哪个类来测试“foo()”?谢谢!在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
}