使用命名参数时PHPUnit的传入参数校验为何失败?
使用命名参数时PHPUnit的传入参数校验为何失败?
兄弟,看你贴的代码里测试类TheTest的方法没写完,但我大概能猜到你遇到的问题——用命名参数调用被测试方法时,PHPUnit的参数校验报错了对吧?先把你提供的代码补全成常见的测试场景,再给你分析原因和解决办法:
<?php use PHPUnit\Framework\TestCase; class Dependency { public function someFunction(int $first, int $second): int { return $first + $second; } } class CodeUnderTest { public function testMe(Dependency $dep, int $first, int $second): int { return $dep->someFunction($first, $second); } } class TheTest extends TestCase { public function testExample() { $mockDep = $this->createMock(Dependency::class); $sut = new CodeUnderTest(); // 假设你在这里用了命名参数,比如打乱顺序传参 $result = $sut->testMe( first: 1, second: 2, dep: $mockDep ); $this->assertEquals(3, $result); } }
问题根源
这本质是老版本PHPUnit和PHP命名参数的兼容性问题。PHP的命名参数允许你自由调整参数顺序,但部分旧版PHPUnit的参数校验逻辑,还是死板地按照方法定义的参数顺序来做类型检查,没有正确识别参数名对应的映射关系。
比如上面的例子,你用命名参数把$dep放到最后,PHPUnit可能会误判第一个传入的1(对应first参数)应该是Dependency类型,直接抛出参数类型不匹配的错误。
解决办法
- 按方法定义的顺序传命名参数:哪怕用命名参数,也严格遵循
testMe的参数顺序(dep→first→second),这样PHPUnit的校验逻辑能正确对应每个参数的类型。 - 升级PHPUnit到最新稳定版:新版本的PHPUnit已经修复了大量和命名参数相关的适配问题,升级后就能正常识别命名参数的映射,不用再纠结顺序。
- 简单场景下用位置传参:如果被测试方法的参数不多,按位置传参反而更直观,还能避开这类兼容性坑。
如果你的报错是“参数类型不匹配”这类提示,那基本就是这个原因,照着上面的方法调整就行。
备注:内容来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

