首页 > 解决方案 > 为什么 Laravel 数据库设置在测试期间不会更改?

问题描述

我有一个laravel项目eith6以下配置:

return [
    'default'     => env('DB_CONNECTION', 'default'),
    'connections' => [
        'default' => [
            'driver'   => 'pgsql',
            'read'     => [
                'host' => env('DB_HOST_READ', '192.168.10.70'),
            ],
            'write'    => [
                'host' => env('DB_HOST_WRITE', '192.168.10.70'),
            ],
            'port'     => env('DB_PORT', '5432'),
            'database' => env('DB_NAME', 'default'),
            'username' => env('DB_USERNAME', ''),
            'password' => env('DB_PASSWORD', ''),
            'charset'  => 'utf8',
            'prefix'   => '',
            'schema'   => 'public',
            'sslmode'  => 'prefer',
            'timezone' => 'Europe/Athens',
        ],
    ]
];

我想在运行 phpunit 时指定测试数据库的设置。因此我在 phpunit.xml 中对其进行了硬编码

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">

    <testsuites>
        <testsuite name="default">
            <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="false"/>

        <env name="DB_NAME" value="test" />

        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="MAIL_DRIVER" value="array"/>

    </php>
</phpunit>

我做了以下测试:

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

class SampleTest extends BaseTestCase
{
   public function testSettings()
   {
      dump(config('database.connections.default'));
      dump(env('DB_NAME'));
   }
}

但是会返回以下结果:

array:4 [
  "default" => array:12 [
    "driver" => "pgsql"
    "read" => array:1 [
      "host" => "192.168.10.70"
    ]
    "write" => array:1 [
      "host" => "192.168.10.70"
    ]
    "port" => "5432"
    "database" => "default"
    "username" => ""
    "password" => ""
    "charset" => "utf8"
    "prefix" => ""
    "schema" => "public"
    "sslmode" => "prefer"
    "timezone" => "Europe/Athens"
  ]
]
"test"

那么在环境返回预期值的情况下,为什么设置配置错误呢?为什么 env 不评估设置中的适当值?

无论 .env 怎么说,在测试期间是否可以强制配置值?

标签: phplaravelphpunitlaravel-5.8

解决方案


一个可能的原因是因为 roque 缓存设置。建议在以下期间清理所有设置缓存setUp

namespace Tests;

use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

class SampleTest extends BaseTestCase
{
   protected function setUp(): void
   {
        parent::setUp();
        Artisan::call('config:clear',['--env'=>'testing']);
        Artisan::call('config:cache',['--env'=>'testing']);
        //rest of test setup.
   }

  // Rest of tests here
}

因此,您将始终拥有全新的设置。


推荐阅读