代码之家  ›  专栏  ›  技术社区  ›  tom

PHPUnit:测试没有具体方法的抽象类

  •  2
  • tom  · 技术社区  · 14 年前

    我已经完成了下面的抽象类,并且有一个关于如何为此编写单元测试的问题。这真的需要吗?因为这个类没有任何具体的方法。

    <?php
    
    abstract class PickupPoint_Abstract {
        public function __construct($client) {}
        public function getPickupPoints($countryCode, $postalCode, $city) {}
        public function getPickupPointDetails($pickupPointId, $countryCode) {} }
    
    3 回复  |  直到 12 年前
        1
  •  2
  •   Christian Strempfer    14 年前

    不,你不需要测试它,因为没有什么可以测试的。

    顺便说一下,抽象方法的定义应该是

    <?php
    abstract class PickupPoint_Abstract {
        public function __construct($client) {}
        abstract public function getPickupPoints($countryCode, $postalCode, $city);
        abstract public function getPickupPointDetails($pickupPointId, $countryCode);
    }
    ?>
    

    您创建了钩子,但不能重写。

    看到了吗 Class Abstraction

        2
  •  4
  •   edorian    14 年前

    因为你不能测试任何预期的行为,所以很难产生任何有意义的测试。


    如果你至少有一个具体的方法,你可以模拟类和测试一个方法,但没有任何代码要测试,我认为你是好去。

    (我想你一直都知道,但为了完成: See Example 11.8 for getMockForAbstractClass on the phpunit site


    即便如此,我还是好奇你为什么不把方法定义成这样的抽象:

    <?php
    abstract class PickupPoint_Abstract {
        abstract public function __construct($client);
        abstract public function getPickupPoints($countryCode, $postalCode, $city);
        abstract public function getPickupPointDetails($pickupPointId, $countryCode); }
    

    因为只有这样解释器才会强制所有方法都在子类中实现。

        3
  •  1
  •   Paul Schramenko    12 年前

    protected setUp() {
        $this->_object = $this->getMockForAbstractClass(
           'PickupPoint_Abstract', array(), '', false
        );
    }
    
    public function testInstanceOf() {
        $this->assertInstanceOf('PickupPoint_Abstract', $this->_object);
    }
    
    public function testMethodsExistance() {
        $methods = get_class_methods($this->_object);
        $this->assertTrue(in_array('getPickupPoints', $methods));
        $this->assertTrue(in_array('getPickupPointDetails', $methods));
        $this->assertTrue(in_array('__construct', $methods));
    }
    
    public function testMethodCount() {
        $methods = get_class_methods($this->_object);
        /**
         * PHPUnit add seven own methods in 3.6.11 + __clone + count of these methods
         */
        $this->assertEquals(11, count($methods));
    }
    

    通过这些测试,您将防止输入错误,检查所需方法的存在性,如果添加任何新方法,此测试将被破坏,因为方法的数量已更改,这是我们想要的行为。

    这个对我来说很好。我总是用这个测试接口,但我认为它可以用于抽象类!