我认为这是一个不寻常的问题,但我会尽可能清楚地解释。我创建了一个简单的工匠命令来完成这个
/**
* 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文件。
有没有人对此有所了解?谢谢!
答案 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
属性:)
祝你好运, 儒略