php - 为什么 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 怎么说,在测试期间是否可以强制配置值?
解决方案
一个可能的原因是因为 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
}
因此,您将始终拥有全新的设置。
推荐阅读
- php - avoid Doctrine DBAL query builder select statement to transform camelcase aliase names to lowercase
- php - Mysql select statement with inner join not working with php but works on mysql terminal
- python - MongoDB在查询后将匹配的键添加到列表中
- c# - 我应该为通用 Windows 平台 (UWP) 应用程序加密资产文件夹中的 CSV 文件吗?
- node.js - 如何检测sails-hook-grunt 发出其“完成”事件的信号?
- python - 如何从 yfinance 中通过 python 创建的列表中删除不需要的字符?
- python - 尝试使用 Python 中的值命名列表
- c++ - 从缓冲区读取/写入文件
- opengl - glStencilFunc中mask参数的作用是什么
- c++ - 初始化列表是否足够静态以允许实例化模板?