讓前端也能填充資料庫的 Reach Seeder 擴充套件

wkan發表於2020-05-11

由來

最近在做一些 TDD 開發的嘗試,前端的同學在寫 e2e 測試的時候需要在資料庫裡預置一些資料。由於是前後端分離的專案,前端要運算元據無非兩種方式:

  • 通過 NodeJS 模組直接連線資料庫;
  • 通過後端提供的 API 介面控制資料庫;

前一種方式需要前端引入額外的包,對於前端已經引入成千上萬個包的現狀來說簡直是雪上加霜。

後一種方法需要後端開發介面,多了介面又會多很多溝通成本,而且這種可以直接運算元據庫的介面也會留下安全隱患。

同時,這種資料填充的需求很容易想到 Laravel 的「模型工廠」,這是一個在介面測試中很常用的填充資料方法。

那如果通過擴充套件的形式,提供介面來呼叫 Laravel 的「模型工廠」填充資料,並且這個擴充套件只在開發和測試環境中安裝,這樣就可以提供統一的介面,也不用擔心安全問題了。

說幹就幹,根據 用 TDD 的方式為 Laravel 開發擴充套件 的教程來新建一個擴充套件專案。

要點

我們需要兩個路由分別對應「模型工廠」的 createmake 方法,通過這兩個路由呼叫「模型工廠」對應的方法,並且可以傳入自定義的模型引數和建立模型的數量。

額外的,還需要一個重新整理資料庫的路由來重置資料庫。

測試怎麼寫

這個功能的實現其實很簡單,但是測試怎麼寫才是重點,這裡講一講在上一篇中沒有提到的測試方法。

首先我們要模擬真實的應用,有 migration 有定義好的 factory ,但是擴充套件包本身是沒有也不需要這些的,所以我們要在測試中載入測試用的 migrationfactory

setUp 方法中載入:

    protected function setUp(): void
    {
        parent::setUp();

        $this->withoutExceptionHandling();
        $this->withFactories(__DIR__.'/../Fixtures/factories');
        $this->loadMigrationsFrom(__DIR__.'/../Fixtures/migrations');
    }

這個兩個方法的功能就是從資料夾里載入 migrationfactory ,這些檔案和正常的 Laravel 應用裡的一樣即可。

另外我們還需要一個模型來做測試,這個可以直接繼承 Illuminate\Database\Eloquent\Model 方法來得到。

這樣就可以像寫普通的介面測試一樣來寫我們這個擴充套件的測試的了。

自動載入擴充套件

當別人在 composer 中引入了擴充套件之後,Laravel 提供了一個自動發現擴充套件的方法,這需要我們在 composer.json 進行一點額外的配置:

"extra": {
    "laravel": {
        "providers": [
            "LaravelPro\\ReachSeeder\\ReachSeederServiceProvider"
        ]
    }
},

這樣 Laravel 就可以自動載入擴充套件了。

擴充套件地址:github.com/laravel-pro/reach-seede...

目前擴充套件還在初始開發階段,有什麼可以加入的功能歡迎大家來討論。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Laravel YES !

相關文章