当前位置:  开发笔记 > 编程语言 > 正文

测试抽象类

如何解决《测试抽象类》经验,为你挑选了3个好方法。

如何使用PHPUnit测试抽象类的具体方法?

我希望我必须创建某种对象作为测试的一部分.虽然,我不知道最好的做法,或者如果PHPUnit允许这样做.



1> Victor Faraz..:

抽象类的单元测试不一定意味着测试接口,因为抽象类可以有具体的方法,并且可以测试这些具体的方法.

在编写一些库代码时,为了拥有您希望在应用程序层中扩展的某个基类,这种情况并不少见.如果你想确保库代码经过测试,你需要手段来表示抽象类的具体方法.

就个人而言,我使用PHPUnit,它有所谓的存根和模拟对象来帮助您测试这类事情.

直接来自PHPUnit手册:

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

模拟对象给你几件事:

你不需要具有抽象类的具体实现,而是可以使用stub来逃避

你可以调用具体方法并断言它们正确执行

如果具体方法依赖于未实现的(抽象)方法,则可以使用will()PHPUnit方法存根返回值


谢谢 - 你的评论对我很有帮助.

2> takeshin..:

这是个好问题.我一直在寻找这个.
幸运的是,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



3> GordonM..:

应该注意的是,从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
}


谢谢你!在PHPUnit中使用匿名类为我创建各种测试提供了很大的灵活性.
推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有