根据代码内容加载不同的php.ini文件

时间:2018-01-05 18:02:55

标签: php phpunit xdebug laravel-5.5

我真的对所发生的事情感到茫然 - 当试图运行测试覆盖率报告时,这一切都始于Error: No code coverage driver is available的PHPUnit错误,最后我调试到下面描述的可复制集。但要设置阶段 - 我使用的是Laravel 5.5,Xdebug 2.5.5,PHPUnit 6.5.5。我的测试代码说明了这个问题:

<?php

use Tests\TestCase;

class A extends TestCase
{
    public function testA()
    {
        echo( get_cfg_var('cfg_file_path')); exit;
    }
}

输出C:\Users\xxx\AppData\Local\Temp\7598.tmp

将它与输出正确的php.ini路径的代码进行比较:

<?php

use PHPUnit\Framework\TestCase;

class A extends TestCase
{
    public function testA()
    {
        echo( get_cfg_var('cfg_file_path')); exit;
    }
}

输出:C:\server\php\php.ini

怎么可能?加载的php.ini文件如何根据执行的代码进行更改?更好的是 - 如何加载我正确的php.ini文件(启用了xdebug),而不是这个冒号?

在这两种情况下,使用phpunit tests\unit\a

启动测试

文件夹结构是:

Laravel Project
└───tests
    └───Unit
        └───A.php

2 个答案:

答案 0 :(得分:11)

我们已将其追踪到位于XdebugHandler.php::writeTmpIni的Composer vendor\composer\composer\src\Composer\XdebugHandler.php函数的问题。

显然在应用程序初始化期间,会生成一个单独的php进程并使用临时php.ini,而对于该进程的PHP进程是传递给的测试,但为什么它已完成,所以是目前超出我的范围。

将在Laravel的错误跟踪器上标记它如何处理。

作为一个包(在我的例子中)添加Composer的依赖性是larapack/hooks,它本身就是larapack/voyager-hooks的依赖,它本身就是Voyager的依赖。

据我所知,在Laravel应用程序初始化期间,不应该触发此行为(为什么要初始化不需要的依赖项,至少是明确的)。为什么Composer在那个阶段触发自己也超出了我的范围。

我们应用的解决方案是添加:

<php>
    <env name="COMPOSER_ALLOW_XDEBUG" value="1"/>
</php>

phpunit.xml文件

我现在提交了这个问题:https://github.com/laravel/framework/issues/22782

关于处理服务提供商(https://laravel.com/docs/5.5/packages#package-discovery),Laravel 5.5的变化导致GitHub的讨论。如何更新,我不知道 - 对我而言,5.4和5.5之间的变化值得在升级中注明(但请阅读Github上发生的讨论并做出自己的决定物);说实话,报告这个问题在我的嘴里留下了酸味,我不会进一步追求它。

我还在larapack/voyager-hooks上就处理5.5中引入的服务提供商发现问题开了一个问题 - https://github.com/larapack/voyager-hooks/issues/16

现在已在larapack/hooks:v1.0.3

中修复此问题

答案 1 :(得分:1)

我之前有一些其他问题对我来说似乎很奇怪。 看起来你正在使用Windows机器作为你的开发者。 我不确定你的php安装。但是发生在我身上的事情我有很多不同的apache,php,phpunit,nginx,mysql实例,它们位于不同的文件夹中。

我的观点是你的机器上安装了很多php。 由于某种原因,不同的PHP解释器正在使用OP中描述的2种情况。

我可能错了,对我用来执行两个测试的命令和文件夹的评论仍然没有回应。

但你可以输出

echo PHP_BINDIR;

在两个测试中都要确保在两种情况下都使用相同的php解释器。