我正在编写一个单元测试并且遇到了一个烦人的问题......假设我有以下我正在测试的功能:
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);
进行此更改后,工作正常。不幸的是,它还会产生以下警告:
第xxx行/ PathToFile中已弃用了调用时传递引用
运行实际代码时没有遇到此错误。它只会在单元测试中抛出此错误。此外,我需要使用模拟,因为我正在嘲笑的类中有方法;所以我不能简单地创建类的新实例并调用正在测试的方法。有什么方法可以解决这个问题吗?
答案 0 :(得分:3)
事实证明,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;
}