fix(test): 防止容器內測試清空開發用 MySQL——bootstrap 強制覆蓋 $_SERVER
根因:docker compose 將 DB_CONNECTION=mysql 注入為真實環境變數, PHPUnit 的 <env force> 只覆蓋 $_ENV/putenv,但 Laravel env() 優先讀 $_SERVER,導致 RefreshDatabase 一直在清空開發 DB(今日實際發生三次, 也是先前『DB 神秘清空』的元凶)。 - 新增 tests/bootstrap.php 於載入前同步覆蓋 $_SERVER/$_ENV/putenv - phpunit.xml bootstrap 指向新檔,DB env 加 force 屬性 - 驗證:容器內全套件後 MySQL 資料存活(users=13) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+6
-3
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
|
||||||
bootstrap="vendor/autoload.php"
|
bootstrap="tests/bootstrap.php"
|
||||||
colors="true"
|
colors="true"
|
||||||
>
|
>
|
||||||
<testsuites>
|
<testsuites>
|
||||||
@@ -22,8 +22,11 @@
|
|||||||
<env name="APP_MAINTENANCE_DRIVER" value="file"/>
|
<env name="APP_MAINTENANCE_DRIVER" value="file"/>
|
||||||
<env name="BCRYPT_ROUNDS" value="4"/>
|
<env name="BCRYPT_ROUNDS" value="4"/>
|
||||||
<env name="CACHE_STORE" value="array"/>
|
<env name="CACHE_STORE" value="array"/>
|
||||||
<env name="DB_CONNECTION" value="sqlite"/>
|
<!-- force:docker compose 將 DB_CONNECTION=mysql 設為真實環境變數,
|
||||||
<env name="DB_DATABASE" value=":memory:"/>
|
phpunit 的 env 預設不覆蓋真實環境變數,導致容器內跑測試時
|
||||||
|
RefreshDatabase 直接清空開發用 MySQL(2026-06-12 實際發生兩次) -->
|
||||||
|
<env name="DB_CONNECTION" value="sqlite" force="true"/>
|
||||||
|
<env name="DB_DATABASE" value=":memory:" force="true"/>
|
||||||
<env name="MAIL_MAILER" value="array"/>
|
<env name="MAIL_MAILER" value="array"/>
|
||||||
<env name="PULSE_ENABLED" value="false"/>
|
<env name="PULSE_ENABLED" value="false"/>
|
||||||
<env name="QUEUE_CONNECTION" value="sync"/>
|
<env name="QUEUE_CONNECTION" value="sync"/>
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// docker compose 將 DB_CONNECTION=mysql 注入為真實環境變數(存在於 $_SERVER),
|
||||||
|
// PHPUnit 的 <env force="true"> 只覆蓋 $_ENV / putenv,而 Laravel env() 透過
|
||||||
|
// phpdotenv 優先讀 $_SERVER——導致容器內跑測試時 RefreshDatabase 直接清空
|
||||||
|
// 開發用 MySQL(2026-06-12 實際發生三次)。必須在 bootstrap 階段三者同步強制。
|
||||||
|
foreach (['DB_CONNECTION' => 'sqlite', 'DB_DATABASE' => ':memory:'] as $key => $value) {
|
||||||
|
$_SERVER[$key] = $value;
|
||||||
|
$_ENV[$key] = $value;
|
||||||
|
putenv("{$key}={$value}");
|
||||||
|
}
|
||||||
|
|
||||||
|
require __DIR__ . '/../vendor/autoload.php';
|
||||||
Reference in New Issue
Block a user