PHP与PHPUnit:如何传入错误参数类型调用方法实现全路径覆盖?
问题分析与解决方案
首先明确核心事实:你的方法参数声明为array $a,PHP的强类型检查会在方法执行之前直接拦截所有非array类型的参数(包括null、非可迭代对象等),抛出TypeError。这种情况下,“不可迭代对象”的代码路径在这个方法中根本不存在——程序根本走不到foreach语句就已经终止报错了,所以不需要针对这种情况做测试。
你的方法实际只有两种可到达的代码路径:
- 传入非空数组:进入
foreach循环,返回第一个元素 - 传入空数组:跳过
foreach循环,返回null
这两种路径用常规PHPUnit测试即可覆盖,示例测试代码如下:
public function testDodo() { $obj = new YourClass(); // 测试非空数组路径 $this->assertEquals('foo', $obj->dodo(['foo', 'bar'])); // 测试空数组路径 $this->assertNull($obj->dodo([])); }
补充说明
如果你的实际复杂代码中,参数类型是iterable而非array,那才需要考虑“不可迭代对象”的情况——此时可以传入一个不可迭代的对象(比如普通的stdClass实例),foreach会抛出Error,你可以用PHPUnit的expectException来捕获这个错误,从而覆盖该路径:
假设方法定义为:
public function dodo(iterable $a) { foreach ($a as $one) { return $one; } return null; }
对应的测试代码:
public function testDodoWithNonIterable() { $obj = new YourClass(); $this->expectException(\Error::class); $obj->dodo(new \stdClass()); }
但回到你的问题,因为你明确要求不修改方法的类型声明(参数为array),所以不存在第三种代码路径,无需额外测试。
内容的提问来源于stack exchange,提问作者Michas
相关产品推荐
相关产品推荐

