2014-02-06 84 views
1

我一直試圖在我的抽象類上使用phpunit進行測試,該類持有將由它的子項共享的受保護方法。我一直在閱讀有關私有/受保護方法的內容,因爲這會使代碼變得脆弱,所以不應該進行測試。在這種情況下,我不希望這些方法成爲公共API(儘管這不會造成任何傷害,但它的感覺不正確),如果同一父行爲執行得很好,我也不想在每個孩子身上進行測試。在phpunit中使用受保護方法的抽象類

所以,作爲一個例子解釋了更多,我會嘗試發佈一個簡單的

abstract class AbstractAuthenticator 
{ 
    abstract function authenticate(); 

    protected function checkUserPrivilege() 
    { 
     ... code 
    } 

    protected function checkEnvPrivileges() 
    { 
     ... code 
    } 

} 

class BasicAuth extends AbstractAuthenticator 
{ 

    public function authenticate() 
    { 
     $this->checkUserPrivilege(); 
     $this->checkEnvPrivileges(); 
     ... code 
    } 
} 

class AjaxAuth extends AbstractAuthenticator 
{ 

    public function authenticate() 
    { 
     $this->checkUserPrivilege(); 
     $this->checkEnvPrivileges(); 
     ... code 
    } 
} 

我的問題(如果我可以做一個以上)爲:

  • 此代碼是否對你有意義嗎?
  • 應有的保護方法變爲公共
  • 如果受保護的方法是公開的,他們應該在類的外部進行檢查或仍處於authenticate()
  • 如果你看到這個API(將所有方法標記爲公共)被稱爲止跌你不知道要調用哪些方法嗎?

謝謝大家。我認爲這個問題很棘手,需要一些觀點來看看,所以我喜歡你的意見

+0

到目前爲止,我已經使用ReflectionClass嘗試了http://stackoverflow.com/a/5013441/1358777建議 –

回答

0

創建一個TestAuth類,並在AbstractAuthenticatorTest中使用它來測試受保護的方法,而不是真正的* Auth對象。

+0

這是一種測試方法的方法。真正的問題是:這是測試除公共API之外的類行爲的正確方法嗎?在做出三種訪問方法之後,我開始明白這裏真正重要的因素是確保抽象認證方法調用'checkUserPrivilege()'和'checkEnvPrivileges()'中的隱式動作,並且只能檢查作爲班級'測試中的斷言 –

+0

您必須測試checkUserPrivilege和checkEnvPrivileges是否按預期工作,並且在預期時調用它們。前者在AbstractAuthenticatorTest中進行測試,後者在每個* Auth類測試中進行測試。也許我錯過了一些東西。問候 – gontrollez

+0

謝謝@gontrollez。我有相同的假設。我會檢查這是最好的答案 –

相關問題