2014-02-18 44 views
0

我有一個類:PHPUnit模擬具有參考參數的控制器嗎?

class Hello { 
    function doSomething(&$reference, $normalParameter) { 
     // do stuff... 
    } 
} 

然後,我有一個控制器:

class myController { 
    function goNowAction() { 
     $hello = new Hello(); 
     $var = new stdClass(); 
     $var2 = new stdClass(); 
     $bla = $hello->doSomething($var, $var2); 
    } 
} 

的 「吉奧」 行動我打電話用我的測試,像這樣:

$this->dispatch('/my/go-now'); 

我想嘲笑「doSomething」方法,因此它返回單詞「GONOW!」。作爲結果。我怎麼做?

我試圖創建一個模擬

$mock = $this->getMock('Hello ', array('doSomething')); 

,然後加回:

$stub->expects($this->any()) 
     ->method('discoverRoute2') 
     ->will($this->returnValue("GONOW!")); 

但我難倒就如何掛鉤該到實際控制人是我m測試。我需要做些什麼才能真正調用模擬方法?

回答

1

您可以爲參考創建一個模擬,或者如果它只是您的代碼顯示的簡單參考,請發送一個變量。然後,可以調用並測試正常的模擬呼叫。

$ReferenceVariable= 'empty'; 

$mock = $this->getMock('Hello ', array('doSomething')); 
$stub->expects($this->any()) 
    ->method('discoverRoute2') 
    ->will($this->returnValue("GONOW!")); 

$this->assertEquals('GONOW!', $stub->doSomething($ReferenceVariable, 'TextParameter')); 
1

您的示例代碼無法正確解釋您的問題。

您的方法允許兩個參數,第一個作爲參考傳遞。但是你爲這兩個參數創建了兩個對象。無論函數的聲明如何,對象總是作爲參考傳遞。

我建議不要聲明一個參數作爲參考傳遞,除非有合理的理由這樣做。如果您期望某個參數是某個對象,請添加一個字體提示。如果它不是一個對象,儘量避免將它作爲引用變量傳遞(這會導致混淆,特別是如果你明確地傳遞一個對象作爲參考,因爲每個人都會試圖弄清楚爲什麼你這樣做)。

但你真正的問題是這樣的:

但我難倒就如何掛鉤這件事給我測試的實際控制人。我需要做些什麼才能真正調用模擬方法?

答案是:不要直接在控制器中用new Hello創建對象。您必須將應該使用的對象傳遞給該控制器。而這個對象或者是真實的東西,或者是測試中的模擬對象。

達到此目的的方法稱爲「依賴注入」或「控制反轉」。任何搜索引擎都應該找到這個含義的解釋。

簡而言之:將要使用的對象傳遞給另一個對象,而不是在內部創建它。您可以使用構造函數來接受該對象作爲參數,或者該方法本身可以允許一個附加參數。你也可以編寫一個setter函數(可選地)調用並用新實例替換通常的默認對象。