为什么phpunit没有像phpunit.xml中指定的那样获取正确的APP_ENV?

为什么phpunit没有像phpunit.xml中指定的那样获取正确的APP_ENV?

问题描述:

我使用Laravel,这是我./phpunit.xml文件为什么phpunit没有像phpunit.xml中指定的那样获取正确的APP_ENV?

<?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="FeatureTests"> 
      <directory suffix="Test.php">./tests/Feature</directory> 
     </testsuite> 

     <testsuite name="UnitTests"> 
      <directory suffix="Test.php">./tests/Unit</directory> 
     </testsuite> 
    </testsuites> 
    <filter> 
     <whitelist processUncoveredFilesFromWhitelist="true"> 
      <directory suffix=".php">./app</directory> 
     </whitelist> 
    </filter> 
    <php> 
     <env name="APP_ENV" value="testing"/> 
     <env name="CACHE_DRIVER" value="array"/> 
     <env name="SESSION_DRIVER" value="array"/> 
     <env name="QUEUE_DRIVER" value="sync"/> 
     <env name="DB_CONNECTION" value="sqlite_testing" /> 
    </php> 
</phpunit> 

我烧我的测试套件,使用下列命令之一:

./vendor/phpunit/phpunit/phpunit --testsuite UnitTests 

在我的测试方法我有:

public function testAllMandatoryData() 
{ 
    dump(env('APP_ENV')); 
    .... 
} 

在phpunit.xml指定它显示“本地”我所期待的“测试”

  <env name="APP_ENV" value="testing"/> 

编辑:额外的细节 我有一个码头工人容器

在泊坞窗,compose.yml运行此应用laravel我设置一些环境变量,如:

environment: 
    - APP_ENV=local 
    - DB_HOST=192.168.0.22 
    - DB_PORT=33306 
    - DB_DATABASE=mydatabase 
    - DB_USERNAME=homestead 
    - DB_PASSWORD=homestead 

我”什么我们注意到phpunit.xml中的指令是这样的:

<env name="APP_ENV" value="testing"/> 

没有e当名字在码头上的时候已经有了。

相反,如果我添加在泊坞窗,compose.yml一些没有定义会被正确地设置在PHPUnit的运行,如:

<env name="DB_CONNECTION" value="sqlite_test"/> 

末编辑

什么我失踪?

谢谢

+2

我不确定你可以重写应用程序级别的容器变量吗?也许这些帮助:https://github.com/docker/compose/issues/3183,http://philippe.bourgau.net/docker-compose-trick-how-to-have-an-overridable-environment-variable- in-development-mode/ –

我尝试用我发现的最佳选择来回答自己。

如果您在泊坞窗,compose.yml文件中设置ENV变量,你将无法与phpunit.xml指令,如覆盖它们:

<env name="APP_ENV" value="testing"/> 

那么你应该选择在此移除(如例如)从泊坞窗 - compose.yml APP_ENV变量设置

,依靠.ENV Laravel文件

APP_ENV=local 

在此设置下,PHPUnit的就能覆盖APP_ENV到“TE刺“

我仍然不是100%确定需要这种安排,所有码头代理版本。我与另一个Docker版本的另一个主机的行为有所不同。

改为使用config('APP_ENV')env()值可能会被缓存,在这种情况下,php artisan config:clear可能会有所帮助,但我在访问命令行环境中的env值时也遇到了问题。

更多信息herehere

+0

谢谢,但您的建议都不适合我。 – koalaok

+0

为什么不能?如果您不提供详细信息,没有人可以提供帮助。 –

+0

从迄今为止发现的发现中添加了一些细节。 – koalaok