切換成記憶體資料庫
記得開啟 pdo_sqlite
。
phpunit.xml修改
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
此時查詢是沒有表的,還需要執行遷移。
tests/TestCase.php執行遷移
$this->artisan('migrate');
執行
sqlite沒有取消嚴格模式的選項
如users
表有很多欄位。nickname
avatar
openid
money
pid
invite_code
…..
在填充測試資料的時候,真不想寫那麼多的 無關
欄位。
無關欄位: nickname
(使用者暱稱) avatar
(頭像) openid
這些。
這些欄位對於 測試訂單
沒有一點作用。
User::create([
'invite_code' => app('invite_code')->enCode(1),
'lv' => User::LV0
]);
這樣會報錯的,因為 openid
是 unique
索引,一堆欄位都是 not null
。
如果是 mysql
直接取消 嚴格模式
就可以了,可惜 sqlite
無此選項。
封裝個懶人的插入資料方法
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Schema;
function modelCreate(Model $model,$data = [])
{
$table = $model->getTable();
$columns = Schema::getColumnListing( // 表的所有欄位名稱
$table
);
$columns = array_fill_keys( // 轉換成 ['nickname' => 0,'avatar' => 0] 這種格式
array_values(
$columns
),0
);
// 所有索引 處理unique
$indexs = \DB::connection()->getDoctrineSchemaManager()->listTableDetails($table)->getIndexes();
foreach ($indexs as $index)
if( $index->isUnique())
$columns[$index->getColumns()[0]] = rand(1,99999999999);
$data = array_merge($columns,$data); // 覆蓋
unset($data['id']); // id自動維護
return $model::unguarded(function () use ($data,$model){ // 忽略黑白名單
return $model::create(
$data
);
});
}
結尾
- 如果直接用
mysql
就沒有那麼多破事了。 - 為什麼不用工廠填充? 要寫太多欄位,且資料不好控制,我只想要必要的測試資料。
我現在心態是炸的,什麼鬼規….
本作品採用《CC 協議》,轉載必須註明作者和本文連結