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

PHPUnit 9中expectExceptionMessageRegExp()已弃用,求替代及版本切换报错解决

PHPUnit 9升级相关问题解答

一、expectExceptionMessageRegExp()的替代函数

在PHPUnit 9中,expectExceptionMessageRegExp()确实已被弃用,官方推荐的替代函数是expectExceptionMessageMatches()。两者用法几乎完全一致,都是接收正则表达式来匹配异常消息,只是函数名做了标准化更新。

举个实际代码的替换例子:
之前的写法:

$this->expectExceptionMessageRegExp('/Failed to process ID: \d+/');

现在改为:

$this->expectExceptionMessageMatches('/Failed to process ID: \d+/');

二、断言失败:Error不匹配Exception的问题

你遇到的「Failed asserting that exception of type "Error" matches expected exception "Exception"」错误,核心原因是PHP里的Error类和Exception类是平级关系——二者都继承自Throwable,但Error并不是Exception的子类。

在PHPUnit 7.1版本中,可能你的测试用例预期捕获Exception,但实际代码抛出了Error(比如类型错误、未定义函数这类系统级错误),当时的PHPUnit对异常类型的校验没那么严格,所以没有报错。但到了PHPUnit 9,异常类型的校验变得更严谨,直接触发了断言失败。

解决方法分两种场景:

  • 如果业务代码确实应该抛出Error(比如类型错误、语法解析错误这类):把测试里的expectException(Exception::class)改成对应的Error子类,比如TypeError::class、ParseError::class,如果不确定具体类型,也可以直接写Error::class(不过更建议精确到具体类型,让测试更严谨)。
  • 如果业务代码应该抛出的是Exception:那就要检查业务逻辑,看看是不是哪里不小心抛出了Error而非自定义的Exception,修正代码里的异常抛出逻辑。

另外,记得把测试中所有的expectExceptionMessageRegExp()都替换成expectExceptionMessageMatches(),这样就能同时解决弃用提示的问题啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 16:40:52