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

