当Laravel工匠抛出致命错误时,CodeView runShellCommand没有失败测试

时间:2016-04-25 18:54:14

标签: laravel codeception artisan

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

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

artisan命令当前抛出PHP致命错误,因为找不到类。那样就好。我知道如何解决它。但是,代码不会发现命令失败。测试通过时不应该。

注意事项:

  • 当我直接在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源代码中找到runShellCommand方法并将die(var_dump($resultCode))添加到方法时,我看到代码看到的结果代码实际上是0.所以为什么Codeception没有看到我直接运行命令时发生的致命错误?

知道这里发生了什么吗?如果由于PHP致命错误导致技工命令失败,如何让我的工匠命令测试失败?

1 个答案:

答案 0 :(得分:1)

最有可能的是,你看到这个的原因有两个:

  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; )

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

    1. 第二个问题可能是execshell导致新线程产生。如果新生成的线程出现错误,则Codeception将无法捕获任何内容。
    2. 在命令行中测试内核命令的文档中没有指南。我相信建议直接测试命令中使用的类。但是,如果你真的想测试整个事情,你总是可以创建一个上面列出的 Kernel.php 类的实例并直接通过call方法运行命令,而不是handle方法。