2011-03-23 60 views
2

我知道的三種方法:應該使用哪種技術來測試PHPUnit中的抽象類功能?

  1. 創建假的子類(相貌醜陋)
  2. 測試真正的子類
  3. 使用getMockForAbstractClass()(用嘲笑的使命矛盾之一;也不能存根不是抽象方法)

根據單元測試的概念最好的方法是什麼?

+1

戈登斯的回答幾乎總結了我的觀點,所以我只是補充一點。我測試了基類中的所有內容,這些基類不依賴抽象方法存在於抽象類中,其餘部分都存在於基類中。雖然有人可能會爭辯說,根本不需要測試基類,只測試派生類(可能有一個基礎測試類;)?),但大多數時候並不值得這樣麻煩。所以我會去4「只測試一次所有子類和基類中的封閉函數」 – edorian 2011-03-23 14:52:21

回答

4

我只會爲從抽象類派生的具體類編寫測試。如果您發現您在其中複製測試,請編寫一個超類並將重複的測試移動到那裏,或者使用getMockForAbstract類。

所以,如果你有這樣的事情:

abstract class Employee 
{ 
    protected $name; 
    public function getName() 
    { 
     return $this->name; 
    } 
    abstract function doWork(); 
    … 
} 

class Mechanic extends Employee 
{ 
    public function doWork() 
    { 
     return // specific to Mechanic 
    } 
} 

class Engineer extends Employee 
{ 
    public function doWork() 
    { 
     return // specific to Engineer 
    } 
} 

我對技工和工程師測試他們doWork實施測試類,但不是他們的getName功能,因爲這是由抽象類繼承。對於這一點,我會寫一個自定義的類,那麼也可以使用getMockForAbstractClass,作爲PHPUnit的手冊中的示例所示:

1

這取決於抽象類功能如何的。當抽象類只是爲了提供一些基本的樣板和一堆模板方法時,我將測試限制在具體的子類中。

當抽象類大部分完成時,我會在測試用例的同一個文件中爲測試創建一個具體的子類,或者我將使用一個模擬。請注意,getMockForAbstractClass()只是幫助您找到所有抽象方法。沒有什麼能阻止你用getMock()來聲明所有的抽象方法和一些具體的抽象方法。出於這個原因,我在我們的基本測試用例中覆蓋了getMock(),在調用父項之前合併所有抽象方法。

相關問題