让前端也能填充数据库的 Reach Seeder 扩展

由来

最近在做一些 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 !
wkan
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!