执行PHPUnit生成Clover覆盖率报告提示Target class [router]不存在错误
报错原因
- 代码存在未解决的Git合并冲突:日志末尾的
<<<<<<< HEAD是Git合并冲突的典型标记,冲突大概率出现在路由配置、服务提供者注册等框架核心启动文件中,导致框架在覆盖率收集阶段初始化服务容器时,无法完成router类的绑定,进而抛出类不存在的错误。 - 执行命令时权限异常:使用sudo运行phpunit会切换为root用户执行,和项目代码、缓存的所属用户不一致,会导致框架配置加载、缓存读写失败,中断路由服务的注册流程。
- 覆盖率配置不合理:phpunit的coverage白名单如果包含了路由文件、框架启动文件,会在容器未完成初始化的阶段提前加载路由相关代码,此时router服务还未绑定到容器,就会触发报错。
解决方案
- 优先解决Git合并冲突:全局搜索项目代码中的
<<<<<<< HEAD、=======、>>>>>>>冲突标记,删除标记后保留正确的业务代码,重点检查routes目录下的路由文件、app/Providers目录下的服务提供者文件。 - 去掉sudo执行phpunit命令:直接运行
./vendor/bin/phpunit --coverage-clover ./report.xml即可。如果遇到目录权限不足的问题,先执行chmod -R 775 storage bootstrap/cache调整框架缓存目录权限,不要用root用户运行phpunit。 - 调整phpunit的覆盖率配置:修改phpunit.xml(或phpunit.xml.dist)文件的coverage节点,排除路由、服务提供者等非业务代码,参考配置如下:
<coverage processUncoveredFiles="true"> <include> <directory suffix=".php">./app</directory> </include> <exclude> <directory suffix=".php">./routes</directory> <directory suffix=".php">./app/Providers</directory> </exclude> </coverage>
- 校验测试用例基类继承关系:确保所有测试用例都继承框架自带的测试基类(如Laravel项目的
Tests\TestCase),保证测试运行前框架服务容器已经完成所有核心服务的注册。
内容的提问来源于stack exchange,提问作者Bhumi Shah
相关产品推荐
相关产品推荐

