2011-11-10 36 views
0

所以我有這個構建器運行一個buildClass方法,該方法應該是公共的,它需要一些參數。PHPUnit Stub,我想替換測試中的函數

在我的測試中,我想完全刪除這些參數,並在PHPUnit中使用Mock添加完全不同的內容。

所以:來源:

class ClassBuilder{ 
    public function buildClass($id, $some, $vars){ 
    $class = new Class($id, $some, $vars); 
    return self::getClass(db_Class, $class); 
    } 
} 

所以,你可能在這裏得到了我的想法,我想打一個模擬所以它的回報功能出現。

$myClassStub->getMock("ClassBuilder"); 
$myClassStub->->expects($this->any()) 
    ->method("buildClass") 
    ->with($this->anything(), $this->anything()) 
    ->will($this->returnCallback("getClass")); 

但我不知道它是如何工作的。這就是我的想法,但我根本不知道在哪裏提出論據。請幫我在這裏,很多appriciated。

/馬庫斯

回答

3

你可以只離開了->with($this->anything(), $this->anything())怎樣exepct如果它的存在,以確保你至少經過2個參數成函數。

除了你我明白的是你想要返回一個不同的類。在這種情況下,我會建議做:

$yourClassToReturn = "..."; // create the class here 

$myClassStub->getMock("ClassBuilder"); 
$myClassStub->expects($this->any()) 
    ->method("buildClass") 
    ->with($this->anything(), $this->anything()) 
    ->will($this->returnValue($yourClassToReturn)); 
+0

好的,所以$ yourClassToReturn也是一個模擬實例呢?所以我以同樣的方式設定了一個。輝煌。但是,我想使用構建器構建的類是從ClassBuilder中的另一個類完成的。所以底線是我想在類構建器中運行一個函數,因爲這是一個私有函數。那可能嗎? – Oldek

+0

問題是,當你嘲笑ClassBuilder時,你不再關心它是私有方法,因爲假的「buildClass」不會與它們進行交互。你只是告訴它「做到這一點」,沒有任何邏輯的東西。 (如果這是有道理的,我理解你的權利?:)) – edorian

+0

好吧,我的意圖是模擬部分功能,而不是測試其他部分。 – Oldek