【问题标题】:Codeception runShellCommand not failing test when Laravel artisan throws a fatal error当 Laravel 工匠抛出致命错误时,Codeception runShellCommand 未通过测试
【发布时间】:2016-08-19 07:55:13
【问题描述】:

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

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

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

注意几点:

  • 当我直接在 shell 中运行 custom 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))时,我看到codeception看到的结果代码实际上是0。那么为什么Codeception没有看到致命错误当我直接运行命令时我会做什么?

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

【问题讨论】:

    标签: laravel codeception laravel-artisan


    【解决方案1】:

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

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

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

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

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

    文档中没有关于从命令行测试内核命令的指南。我相信更建议直接测试命令中使用的类。但是,如果你真的想测试整个事情,你总是可以创建一个上面列出的 Kernel.php 类的实例,并直接通过 call 方法运行命令,而不是 @ 987654326@方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-29
      • 2016-08-31
      • 1970-01-01
      • 2015-02-21
      • 2019-09-19
      • 2022-12-03
      • 2018-05-07
      • 2018-06-03
      相关资源
      最近更新 更多