我正在使用以下指令运行代码测试:
$I->runShellCommand('php artisan <custom command>');
artisan命令当前抛出PHP致命错误,因为找不到类。那样就好。我知道如何解决它。但是,代码不会发现命令失败。测试通过时不应该。
注意事项:
使用
$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源代码中找到runShellCommand方法并将die(var_dump($resultCode))
添加到方法时,我看到代码看到的结果代码实际上是0.所以为什么Codeception没有看到我直接运行命令时发生的致命错误?
知道这里发生了什么吗?如果由于PHP致命错误导致技工命令失败,如何让我的工匠命令测试失败?
答案 0 :(得分:1)
最有可能的是,你看到这个的原因有两个:
Artisan命令包含在try / catch块中。您可以在方法句柄中的 Illuminate \ Foundation \ Console \ Kernel.php 中看到此信息。因此,抛出的PHP引擎异常永远不会超越Laravel的处理程序。当Laravel捕获其中一个异常时,它会将响应交给Symphony的控制台渲染器,该渲染器将按以下格式返回一个数组:
阵 ( [0] =&gt; [1] =&gt; [2] =&gt; [例外名称] [3] =&gt;文字说明。 [4] =&gt; [5] =&gt; )
现在,当通过exec
或shell
使用控制台命令时,如果结果是数组,它将仅输出第一个索引,除非以特殊方式处理;喜欢print_r。在这种情况下,这是一个空值。
exec
和shell
导致新线程产生。如果新生成的线程出现错误,则Codeception将无法捕获任何内容。在命令行中测试内核命令的文档中没有指南。我相信建议直接测试命令中使用的类。但是,如果你真的想测试整个事情,你总是可以创建一个上面列出的 Kernel.php 类的实例并直接通过call
方法运行命令,而不是handle
方法。