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

如何修复Symfony5结合PHPUnit与Phake测试时出现的弃用通知

结论

你的判断完全正确,这些弃用通知和你的业务代码无关,是Phake生成模拟类的机制和Symfony 5.3的更新不兼容导致的。

问题原因

这次报错对应的是Symfony 5.3的两处更新:

  • Symfony\Bridge\Twig\Mime\TemplatedEmail 新增了标记为@internal的__serialize()和__unserialize()方法,Phake生成模拟类时会直接继承原类,因此触发了「不应继承内部方法」的检测
  • Symfony\Contracts\Translation\TranslatorInterface 新增了getLocale()方法,Phake生成模拟类时没有自动实现该接口方法,因此触发了方法缺失的警告
修复方案(无需关闭全局弃用通知)

方案1:针对性适配模拟逻辑

  • 针对TranslatorInterface的警告:给模拟对象的getLocale()方法随便加个桩返回即可,即使你的测试用不到这个方法,添加后就不会触发缺失提醒:
Phake::when($translator)->getLocale()->thenReturn('en');
  • 针对TemplatedEmail的警告:你当前的测试仅需要验证该对象被正确传入send()方法,完全可以直接初始化真实对象而非用Phake模拟,从根源避免继承问题:
// 把原来的Phake::mock(TemplatedEmail::class)替换为
$this->email = new \Symfony\Bridge\Twig\Mime\TemplatedEmail();

方案2:过滤Phake模拟类的弃用通知

如果你不想修改现有测试逻辑,可以利用symfony/phpunit-bridge的弃用过滤规则,在phpunit.xml.dist中添加如下配置,仅过滤所有Phake生成的模拟类触发的弃用,不会影响业务代码的弃用检测:

<php>
    <env name="SYMFONY_DEPRECATIONS_HELPER" value="ignore#.*_PHAKE.*#" />
</php>
问题归属

该问题既不属于PHPUnit也不属于symfony/phpunit-bridge的故障,是Phake生成模拟类的逻辑没有适配Symfony的更新导致的兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 05:06:00