2010-09-15 102 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)); 
} 

藉助這些測試,你會避免錯別字,檢查所需的方法存及其是否有新的方法將被添加,這個測試將被打破,因爲方法的數量已經改變了,這就是我們想要的行爲。

這對我來說很好。我總是使用這個接口的測試,但我認爲它可以用於抽象類!

相關問題