当 Laravel artisan 抛出致命错误时,Codeception runShellCommand 未通过测试

Codeception runShellCommand not failing test when Laravel artisan throws a fatal error

我正在 运行使用以下指令进行代码检测测试:

$I->runShellCommand('php artisan <custom command>');

artisan 命令当前抛出 PHP 致命错误,因为未找到 class。那也行。我知道如何解决它。但是,codeception 并没有发现命令失败。测试在不应该通过的时候通过了。

一些注意事项:

知道这里发生了什么吗?如果 artisan 命令由于 PHP 致命错误而失败,我怎样才能让我的 artisan 命令测试失败?

很可能,您看到这个的原因有两个:

  1. Artisan 命令包装在 try / catch 块中。你可以在方法Illuminate\Foundation\Console\Kernel.php中看到这个handle。因此,抛出的 PHP 引擎异常永远不会传递到 Laravel 的处理程序之外。当 Laravel 捕捉到这些异常之一时,它会将响应交给 Symphony 的控制台渲染器,returns 一个格式如下的数组:

    数组 ( [0] => [1] => [2] => [异常名称] [3] => 文字说明。 [4]=> [5] => )

现在,当通过 execshell 使用控制台命令时,如果结果是数组,它将只输出第一个索引,除非以特殊方式处理;喜欢 print_r。在本例中,这是一个空值。

  1. 第二个问题可能是 execshell 都会导致产生新线程。如果新生成的线程出现错误,Codeception 将无法捕获任何内容。

文档中没有从命令行测试内核命令的指南。我认为更推荐直接测试命令中使用的 classes。但是,如果你真的想测试整个事情,你总是可以创建上面列出的 Kernel.php class 和 运行 的实例命令直接通过 call 方法,而不是 handle 方法。