如何修复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é
相关产品推荐
相关产品推荐

