PHPUnit和呼叫时间通过引用传递

PHPUnit和呼叫时间通过引用传递,phpunit,pass-by-reference,Phpunit,Pass By Reference,我正在编写一个单元测试,遇到了一个恼人的问题。。。假设我正在测试以下功能: public function functionToTest(array &$data, parameter2) { // perform some action on the array that is being passed in by reference } 现在,当我在单元测试中尝试调用此函数时,我会执行如下操作: public function testMyFunction() {

我正在编写一个单元测试,遇到了一个恼人的问题。。。假设我正在测试以下功能:

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
}
但是,我收到以下错误消息:

ClassName::addNewFriendsToProfile()的参数1应为引用,给定值

这对我来说似乎很奇怪。首先,我只是通过引用传递一个数组,所以它应该没有问题。第二,为什么是参数1?它不是指参数0吗?然后,我尝试将呼叫更改为以下内容:

$this->mockOfClass->functionToTest(&$data, true);
进行此更改后,效果良好。不幸的是,它还产生以下警告:

第xxx行的/PathToFile中不推荐使用按引用传递调用时间


我在运行实际代码时没有遇到此错误。它只在单元测试中抛出此错误。另外,我需要使用mock,因为我要模拟的类中有一些方法;因此,我不能简单地创建类的新实例并调用正在测试的方法。有什么办法可以绕过这个问题吗?

事实证明,PHPUnit克隆了传入的每个参数(感谢Tim Lytle为我指出了这个来源:)。如果在单元测试中调用时传入数组而没有引用,这就是导致错误的原因。幸运的是,解决方案很简单。我不是通过引用传递数组,而是通过值传递数组并返回数组

之前:

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

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

    return $myArray;
}

相关的谢谢你,蒂姆,这很有帮助。问题似乎与PHPUnit中克隆的每个参数有关。