2010-09-15 42 views
2

我跟随抽象类并且有一个关于如何为此编写单元测试的问题。这实际上是否需要?由于这个类没有任何具体的方法。PHPUnit:在没有具体方法的情况下测试一个抽象类

<?php 

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

这不是一个抽象类,而是一个接口。抽象类定义了两个方法存根和实现的方法。 – halfdan 2010-09-15 08:51:47

+0

可能的重复http://stackoverflow.com/questions/190295/phpunit-testing-abstract-classes – 2010-09-15 08:52:09

回答

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

+0

我忘了摘要!谢谢。 – tom 2010-09-15 09:03:22

+1

我有礼貌地不同意,我认为op的声明他的方法的方法可以在子类中被覆盖,他们不需要定义,因此它们不是抽象的。在这种情况下,抽象作为一个定义了所有函数的常规类,错过了真正的OOP抽象。 – stefgosselin 2011-05-18 12:17:29

+0

我不明白你的评论。你不同意什么? – 2011-05-18 13:04:18

4

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


如果有至少一个具体的方法,你可以嘲笑类和测试进行测试的一种方法,但没有任何代码,我说你是好去。

(我想你知道,但总是完成的缘故: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); } 

因为只有解释程序会强制所有方法都在子类中实现。

1

对于这种情况和测试接口我会写至少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)); 
} 

借助这些测试,你会避免错别字,检查所需的方法存及其是否有新的方法将被添加,这个测试将被打破,因为方法的数量已经改变了,这就是我们想要的行为。

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

相关问题