2012-06-10 43 views
3

我有我寫,遇到了一個惱人的問題一個單元測試...比方說,我有以下功能我測試:的PHPUnit和呼叫時間傳遞通過引用

public function functionToTest(array &$data, parameter2) 
{ 
    // perform some action on the array that is being passed in by reference 
} 

現在,當我試圖調用這個函數在我的單元測試,我會做這樣的事情:

public function testMyFunction() 
{ 
    $data = array('key1' => 'val1'); 

    $mockOfClass = $this->getMockBuilder('ClassName') 
     ->disableOriginalConstructor() 
     ->setMethods(array('method1', 'method2')) // My function to test is NOT in this list 
     ->getMock(); 

    $this->mockOfClass->functionToTest($data, true); 

    // Perform assertions here 
} 

不過,我收到以下錯誤信息:

參數1到ClassName :: addNewFriendsToProfile()預計會成爲參考,給出的值

這對我來說似乎很奇怪。首先,我只是通過引用傳遞一個數組,所以它不應該有這個問題。其次,爲什麼參數1?這是不是意味着參數0?然後,我嘗試將呼叫更改爲以下內容:

$this->mockOfClass->functionToTest(&$data, true); 

做出此更改後,它可以正常工作。不幸的是,它也產生了以下警告:

通話時傳遞的引用已被棄用/ PathToFile在線XXX

運行的實際代碼時,我沒有遇到這個錯誤。它只在單元測試中拋出這個錯誤。另外,我需要使用模擬,因爲我正在嘲笑的課程中有方法;所以我不能簡單地創建一個新的類實例並調用正在測試的方法。有什麼方法可以解決這個問題嗎?

+1

相關? http://stackoverflow.com/questions/5170747/pass-by-reference-in-a-callback-when-mocking-in-phpunit –

+0

謝謝蒂姆,這是非常有幫助的。看起來問題與在PHPUnit中克隆的每個參數有關。 –

回答

2

事實證明,PHPUnit克隆了正在傳入的每個參數(感謝Tim Lytle將我指向此源:Pass by reference in a callback when mocking in PHPUnit)。如果在單元測試中在調用時沒有引用傳入數組,那麼會導致錯誤。幸運的是,解決方案很簡單。我不是通過引用傳遞數組,而是通過值傳遞數組並返回數組。

前:

public function someFunction(array &$myArray) 
{ 
    $myArray[] = 'new val'; 
} 

後:

public function someFunction(array $myArray) 
{ 
    $myArray[] = 'new val'; 

    return $myArray; 
} 
0

當傳遞參數時,函數中需要&以指示它是通過引用傳遞的,而不是對函數的調用。

/** 
* @param array $PassedArray Array to Check for Value 
* @param boolean $CheckValue  Perform Check 
*/ 
function Foo(&$PassedArray, $CheckValue) 
{ 
    ... 
} 
$data = array('key1' => 'val1'); 
$exists = Foo($data, TRUE); 

接受數組作爲參考的函數有&。在函數調用上使用&會導致不推薦使用的問題。

+1

是的,在通話時使用&功能將導致不推薦使用的問題。問題是,如果你不這樣做PHPUnit,會發生錯誤。 –