【问题标题】:PHPUnit: Test an abstract class without concrete methodsPHPUnit:测试没有具体方法的抽象类
【发布时间】:2011-04-12 13:50:53
【问题描述】:

我正在关注抽象类,并且有一个关于如何为此编写单元测试的问题。这实际上需要吗?因为这个类没有任何具体的方法。

<?php

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

【问题讨论】:

标签: php unit-testing phpunit


【解决方案1】:

由于您无法测试任何预期行为,因此似乎很难产生任何有意义的测试。


如果你至少有一个具体的方法,你可以模拟类并测试一个方法,但没有任何代码要测试,我会说你很好。

(我想你一直都知道,但为了完成: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); }

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

【讨论】:

    【解决方案2】:

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

    顺便提一下,抽象方法应该像这样定义

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

    你制作了钩子,它可能不会被覆盖。

    Class Abstraction

    【讨论】:

    • 我确实忘记了摘要!谢谢。
    • 我礼貌地不同意,我认为 op 声明他的方法的方式可以在不需要定义的子类中被覆盖,因此它们不是抽象的。在这种情况下,抽象就像一个定义了所有函数的常规类,错过了真正的 OOP 抽象。
    • 我不明白你的评论。你不同意什么?
    【解决方案3】:

    对于这种情况和测试接口,我至少会编写 3 个测试:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2014-03-04
      • 2018-05-12
      相关资源
      最近更新 更多