You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Doctrine至2.6后PHPSpec因getEntityChangeSet()返回引用失效

解决Doctrine 2.6升级后PHPSpec中getEntityChangeSet()的引用返回问题

刚把Doctrine ORM从2.5升级到2.6就碰到PHPSpec报错?这种升级踩坑的滋味太熟悉了。你遇到的returning by reference not supported错误,根源就是Doctrine 2.6把getEntityChangeSet()改成了按引用返回(函数定义里的&符号就是明证),但PHPSpec默认的willReturn()方法不支持模拟这种引用返回的方法。

下面给你几个可行的解决办法:

  • 直接替换成willReturnReference()
    PHPSpec其实提供了专门处理引用返回的方法,把你原来的代码:

    $unitOfWork->getEntityChangeSet($site)->willReturn(['_dataParent' => [0 => 2, 1 => 3]]);
    

    改成:

    $unitOfWork->getEntityChangeSet($site)->willReturnReference(['_dataParent' => [0 => 2, 1 => 3]]);
    

    这个方法会告诉PHPSpec返回一个引用类型的值,完美匹配Doctrine 2.6的方法定义。

  • 显式创建引用变量(备用方案)
    要是上面的方法偶尔不生效,你可以先手动创建一个引用变量,再传给willReturnReference():

    $changeSet = ['_dataParent' => [0 => 2, 1 => 3]];
    $unitOfWork->getEntityChangeSet($site)->willReturnReference($changeSet);
    

    这样能确保返回的是标准的引用类型,避免PHPSpec的类型校验报错。

  • 检查PHPSpec版本
    如果你用的是比较老的PHPSpec版本(比如3.3及以下),可能对引用返回的模拟支持不够完善。建议升级到PHPSpec 3.4或更高版本,能减少这类兼容性问题。

顺带提一句:Doctrine 2.6改这个方法为引用返回,主要是为了性能优化,允许开发者直接修改变更集(不过官方其实不建议这么干)。但在测试场景下,我们只需要模拟返回值,用上面的方法就能轻松绕过这个限制。

内容的提问来源于stack exchange,提问作者RomulusED69

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:14:20