2012-06-10 25 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,会发生错误。 –