Unit testing 测试抽象类

Unit testing 测试抽象类,unit-testing,phpunit,abstract-class,Unit Testing,Phpunit,Abstract Class,如何使用PHPUnit测试抽象类的具体方法 我希望我必须创建某种对象作为测试的一部分。虽然,我不知道这方面的最佳实践,或者PHPUnit是否允许这样做。Eran,您的方法应该可以工作,但它违背了在实际代码之前编写测试的趋势 我的建议是,对所讨论的抽象类的非抽象子类的所需功能编写测试,然后编写抽象类和实现子类,最后运行测试 显然,您的测试应该测试抽象类的已定义方法,但始终通过子类进行测试。如果您不想对抽象类进行子类化,只是为了对已经在抽象类中实现的方法执行单元测试,您可以尝试查看您的框架是否允许抽

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


我希望我必须创建某种对象作为测试的一部分。虽然,我不知道这方面的最佳实践,或者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
    }