从Artisan命令调用PHPUnit将忽略XML文件

时间:2016-11-11 11:23:07

标签: laravel testing laravel-5 phpunit artisan

我认为这是一个不寻常的问题,但我会尽可能清楚地解释。我创建了一个简单的工匠命令来完成这个

 /**
 * Execute the console command.
 */
public function handle()
{
    $this->info("==> Cleaning up reports and docs...");

    $command = new Process("rm -f tests/docs/* && rm -rf test/reports/*");
    $command->run();

    $this->warn("==> Reports and docs are clean");

    $this->info("==> Executing Tests Suite...");
    $command = new Process("vendor/bin/phpunit --coverage-html tests/reports --testdox-html tests/docs/reports.html -v --debug");
    $command->run();
    $this->info($command->getIncrementalOutput());

    $this->warn("==> report generated >> test/reports. Documentation generated >> test/docs/reports.html");
}

这看起来有点奇怪,但它实际上非常有用,它启动了PHPUnit的覆盖支持和其他东西。问题是,如果我像php artisan ludo237:full-test那样运行这个命令,它将完全忽略phpunit.xml实际上它将显示并且错误表明MySQL数据库不存在,即使我已经设置了我的phpunit.xml内部的sqlite连接,您可以清楚地看到它是正确的:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="bootstrap/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Application Test Suite">
            <directory suffix="Test.php">./tests</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="APP_DEBUG" value="true"/>
        <env name="APP_URL" value="http://localhost:8000"/>
        <env name="DB_CONNECTION" value="sqlite"/>
        <env name="DB_DATABASE" value=":memory:" />
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="MAIL_DRIVER" value="log"/>
        <env name="MAIL_PRETEND" value="true"/>
    </php>
</phpunit>

我知道我可以简单地为该命令行创建一个bash别名,实际上这是我当前的热门修复,但此时我只是好奇地理解为什么当我从工匠发出phpunit命令时命令它忽略XML文件。

有没有人对此有所了解?谢谢!

1 个答案:

答案 0 :(得分:2)

我花了很多时间来调试它,但最后我发现它为什么不起作用。

首先,让我澄清一下,您的代码没有任何问题,即使Process类没有任何问题,即使使用本机exec函数,您也会获得相同的行为。< / p>

其次,phpunit.xml文件完全被读取,完全没有问题。

说,真正的问题在于,PHPUnit不允许你重新定义(或覆盖)任何env变量,因为there is a check that prevents that

这是因为Laravel没有解析phpunit.xml文件本身,而且在你调用它的那一刻,它已经太晚了the environment variables are defined,要么通过putenv,{{ 1}}和/或$_SERVER

正因如此,I created an Issue on PHPUnit,即使在最新版本(截至今天),这个问题仍然存在,即使这是was already asked in the past

不幸的是我还没有解决方案,但让我们交叉一下让我们等待PHPUnit添加建议的$_ENV属性:)

祝你好运, 儒略