【问题标题】:Why Laravel database settings do not change upon during testing?为什么 Laravel 数据库设置在测试期间不会更改?
【发布时间】:2021-11-19 16:55:11
【问题描述】:

我有一个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 怎么说,在测试期间是否可以强制配置值?

【问题讨论】:

    标签: php laravel phpunit laravel-5.8


    【解决方案1】:

    一个可能的原因是因为 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
    }
    

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

    【讨论】:

    • 不,先生,永远不要在测试中缓存任何东西...删除那两行代码,不要缓存...这是一个测试,它必须始终保持原始...
    • 那么我如何在 laravel 中告诉不要缓存测试设置?
    • 默认不缓存,不缓存任何东西。也许您的代码中有一些东西正在缓存配置,但默认情况下,它不会这样做。
    猜你喜欢
    • 2014-08-03
    • 2014-09-03
    • 2015-03-04
    • 1970-01-01
    • 2014-12-19
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    相关资源
    最近更新 更多