記一次想簡單化的單元測試

lyxxxh發表於2020-10-09

切換成記憶體資料庫

記一次想簡單化的單元測試

記得開啟 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
]);

這樣會報錯的,因為 openidunique 索引,一堆欄位都是 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
            );
        });
    }

記一次想簡單化的單元測試

結尾

  1. 如果直接用 mysql 就沒有那麼多破事了。
  2. 為什麼不用工廠填充? 要寫太多欄位,且資料不好控制,我只想要必要的測試資料。

我現在心態是炸的,什麼鬼規….

本作品採用《CC 協議》,轉載必須註明作者和本文連結
專心學習不瞎搞

相關文章