【问题标题】:PHPUnit and Call-time pass-by-referencePHPUnit 和调用时传递引用
【发布时间】:2012-06-15 19:24:13
【问题描述】:

我正在编写一个单元测试,但遇到了一个烦人的问题...假设我正在测试以下函数:

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 中已弃用调用时传递引用

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

【问题讨论】:

标签: phpunit pass-by-reference


【解决方案1】:

事实证明,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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多