Laravel单元测试首次运行自定义Artisan命令报CommandNotFoundException错误
问题原因
- 你仅修改了composer.json的PSR-4自动加载配置,未同步修改Laravel框架本身的app目录默认路径映射。Laravel默认
app_path()指向项目根目录下的app文件夹,你将目录迁移到src/app后未做对应配置,导致首次初始化时app_path()返回不存在的路径,realpath()检测到路径不存在返回false,Console内核无法遍历到自定义命令所在目录,因此报命令不存在错误。 - PHPUnit默认开启测试结果缓存,首次运行测试失败后,第二次运行同名用例时会复用之前进程中已经完成初始化的容器配置,此时
app_path()已经被自动加载逻辑间接修正,因此可以正常找到命令。修改用例名后测试缓存不命中,会重新走首次初始化逻辑,因此错误复现。
解决方案
- 修正Laravel的app路径配置
打开bootstrap/app.php文件,在Application实例化代码后添加路径指定逻辑:
$app = new Illuminate\Foundation\Application( $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) ); // 新增以下行,指定实际的app目录路径 $app->useAppPath($app->basePath('src/app'));
- 清理所有相关缓存
依次执行以下命令清理缓存:
php artisan config:clear php artisan route:clear ./vendor/bin/phpunit --clear-cache
- 兜底配置(可选)
如果仍偶发加载失败,可以在src/app/Console/Kernel.php的$commands属性中手动注册自定义命令,绕过自动扫描逻辑:
protected $commands = [ \App\Console\Commands\CreateNewUser::class, ];
内容的提问来源于stack exchange,提问作者Shanaka Madusanka
相关产品推荐
相关产品推荐

