升级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
相关产品推荐
相关产品推荐

