当 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 并没有发现命令失败。测试在不应该通过的时候通过了。
一些注意事项:
- 当我运行直接在一个shell自定义artisan命令时,退出码是255
正在使用
$I->runShellCommand('php artisan <custom command>');
$I->seeInShellOutput('error');`
消息失败
Step I see in shell output "error"
Fail Failed asserting that '' contains "error".
(为什么 codeception 在命令产生错误时看不到任何输出?)
正在使用
$I->runShellCommand('php artisan up');
$I->seeInShellOutput('error');
如预期的那样失败并显示消息
Step I see in shell output "error"
Fail Failed asserting that 'Application is now live.' contains "error".
(Codeception 显然看到了没有出错的命令的输出。)
当我在Codeception源码中找到运行ShellCommand方法并在该方法中添加die(var_dump($resultCode))
时,我看到codeception看到的结果代码实际上是0. 那么,为什么当我直接 运行 命令时,Codeception 没有看到我执行的致命错误?
知道这里发生了什么吗?如果 artisan 命令由于 PHP 致命错误而失败,我怎样才能让我的 artisan 命令测试失败?
很可能,您看到这个的原因有两个:
Artisan 命令包装在 try / catch 块中。你可以在方法Illuminate\Foundation\Console\Kernel.php中看到这个handle。因此,抛出的 PHP 引擎异常永远不会传递到 Laravel 的处理程序之外。当 Laravel 捕捉到这些异常之一时,它会将响应交给 Symphony 的控制台渲染器,returns 一个格式如下的数组:
数组
(
[0] =>
[1] =>
[2] => [异常名称]
[3] => 文字说明。
[4]=>
[5] =>
)
现在,当通过 exec
或 shell
使用控制台命令时,如果结果是数组,它将只输出第一个索引,除非以特殊方式处理;喜欢 print_r。在本例中,这是一个空值。
- 第二个问题可能是
exec
和 shell
都会导致产生新线程。如果新生成的线程出现错误,Codeception 将无法捕获任何内容。
文档中没有从命令行测试内核命令的指南。我认为更推荐直接测试命令中使用的 classes。但是,如果你真的想测试整个事情,你总是可以创建上面列出的 Kernel.php class 和 运行 的实例命令直接通过 call
方法,而不是 handle
方法。
我正在 运行使用以下指令进行代码检测测试:
$I->runShellCommand('php artisan <custom command>');
artisan 命令当前抛出 PHP 致命错误,因为未找到 class。那也行。我知道如何解决它。但是,codeception 并没有发现命令失败。测试在不应该通过的时候通过了。
一些注意事项:
- 当我运行直接在一个shell自定义artisan命令时,退出码是255
正在使用
$I->runShellCommand('php artisan <custom command>'); $I->seeInShellOutput('error');`
消息失败
Step I see in shell output "error" Fail Failed asserting that '' contains "error".
(为什么 codeception 在命令产生错误时看不到任何输出?)
正在使用
$I->runShellCommand('php artisan up'); $I->seeInShellOutput('error');
如预期的那样失败并显示消息
Step I see in shell output "error" Fail Failed asserting that 'Application is now live.' contains "error".
(Codeception 显然看到了没有出错的命令的输出。)
当我在Codeception源码中找到运行ShellCommand方法并在该方法中添加
die(var_dump($resultCode))
时,我看到codeception看到的结果代码实际上是0. 那么,为什么当我直接 运行 命令时,Codeception 没有看到我执行的致命错误?
知道这里发生了什么吗?如果 artisan 命令由于 PHP 致命错误而失败,我怎样才能让我的 artisan 命令测试失败?
很可能,您看到这个的原因有两个:
Artisan 命令包装在 try / catch 块中。你可以在方法Illuminate\Foundation\Console\Kernel.php中看到这个handle。因此,抛出的 PHP 引擎异常永远不会传递到 Laravel 的处理程序之外。当 Laravel 捕捉到这些异常之一时,它会将响应交给 Symphony 的控制台渲染器,returns 一个格式如下的数组:
数组 ( [0] => [1] => [2] => [异常名称] [3] => 文字说明。 [4]=> [5] => )
现在,当通过 exec
或 shell
使用控制台命令时,如果结果是数组,它将只输出第一个索引,除非以特殊方式处理;喜欢 print_r。在本例中,这是一个空值。
- 第二个问题可能是
exec
和shell
都会导致产生新线程。如果新生成的线程出现错误,Codeception 将无法捕获任何内容。
文档中没有从命令行测试内核命令的指南。我认为更推荐直接测试命令中使用的 classes。但是,如果你真的想测试整个事情,你总是可以创建上面列出的 Kernel.php class 和 运行 的实例命令直接通过 call
方法,而不是 handle
方法。