2014-01-14 59 views
2

注意:我試圖存根出使用的\HTML5對象我的測試之一內。PHPUnit的存根返回意外的NULL值

當模擬loadHTML()方法並設置返回值時,該值返回爲NULL。

/** Set up my expectations **/ 
$stub = $this->getMock("\HTML5"); 
$stub->expects($this->once()) 
    ->method("loadHTML") 
    ->with("some data") 
    ->will($this->returnValue("Some Value")); 

上面設置的期望調用\HTML5::loadHTML("some data")將返回字符串Some Value。我們稱之爲這種方法。

var_dump($stub->loadHTML("some data")); // NULL 

調用loadHTML()顯示NULL的返回值。

爲什麼我的預期值沒有被返回?這是一個錯誤?我正在使用的庫有問題嗎?

  • \HTML5對象不具有特定constructor實現,所以我並不需要調用disableOriginalConstructor()$stub對象繞過這一點。

  • loadHTML()method只需要一個字符串,因爲它的參數,我包括。

我使用:

  • PHP 5.4.9
  • PHPUnit的28年3月7日
  • 我的大腦

回答

2

loadHTML()方法是靜態方法。在PHPUnit中,您不會使用expects()設置模擬靜態方法期望;您必須改用staticExpects()

這並不是馬上要考慮的原因,因爲PHP允許調用靜態方法,因爲如果封裝這些方法的對象已經實例化,那麼可以調用一個常規方法。

我已經創建了\HTML5對象,因此靜態方法可以與->,而不是通常::可以不用實例化對象使用調用。

2010年,Sebastian Bermann wrote a post描述了一種新的staticExpects()方法,可用於PHPUnit 5.3+

這裏是上面重新編寫使用靜態方法的代碼:在自己的代碼

$stub = $this->getMock("\HTML5"); 
$stub->staticExpects($this->once()) 
    ->method("loadHTML") 
    ->with("some data") 
    ->will($this->returnValue("Some Value")); 

var_dump($stub->loadHTML("some data")); // "Some Value" 

總之,只是不寫靜態方法。這將使其他開發人員的測試(如我的)更難以處理必須進入外部庫的源代碼,以瞭解爲什麼我無法通過嘲笑他們的代碼來測試我的代碼。