我知道的三種方法:應該使用哪種技術來測試PHPUnit中的抽象類功能?
- 創建假的子類(相貌醜陋)
- 測試真正的子類
- 使用getMockForAbstractClass()(用嘲笑的使命矛盾之一;也不能存根不是抽象方法)
根據單元測試的概念最好的方法是什麼?
我知道的三種方法:應該使用哪種技術來測試PHPUnit中的抽象類功能?
根據單元測試的概念最好的方法是什麼?
我只會爲從抽象類派生的具體類編寫測試。如果您發現您在其中複製測試,請編寫一個超類並將重複的測試移動到那裏,或者使用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的手冊中的示例所示:
這取決於抽象類功能如何的。當抽象類只是爲了提供一些基本的樣板和一堆模板方法時,我將測試限制在具體的子類中。
當抽象類大部分完成時,我會在測試用例的同一個文件中爲測試創建一個具體的子類,或者我將使用一個模擬。請注意,getMockForAbstractClass()
只是幫助您找到所有抽象方法。沒有什麼能阻止你用getMock()
來聲明所有的抽象方法和一些具體的抽象方法。出於這個原因,我在我們的基本測試用例中覆蓋了getMock()
,在調用父項之前合併所有抽象方法。
戈登斯的回答幾乎總結了我的觀點,所以我只是補充一點。我測試了基類中的所有內容,這些基類不依賴抽象方法存在於抽象類中,其餘部分都存在於基類中。雖然有人可能會爭辯說,根本不需要測試基類,只測試派生類(可能有一個基礎測試類;)?),但大多數時候並不值得這樣麻煩。所以我會去4「只測試一次所有子類和基類中的封閉函數」 – edorian 2011-03-23 14:52:21