让前端也能填充数据库的 Reach Seeder 扩展
由来
最近在做一些 TDD 开发的尝试,前端的同学在写 e2e 测试的时候需要在数据库里预置一些数据。由于是前后端分离的项目,前端要操作数据无非两种方式:
- 通过 NodeJS 模块直接连接数据库;
- 通过后端提供的 API 接口控制数据库;
前一种方式需要前端引入额外的包,对于前端已经引入成千上万个包的现状来说简直是雪上加霜。
后一种方法需要后端开发接口,多了接口又会多很多沟通成本,而且这种可以直接操作数据库的接口也会留下安全隐患。
同时,这种数据填充的需求很容易想到 Laravel 的「模型工厂」,这是一个在接口测试中很常用的填充数据方法。
那如果通过扩展的形式,提供接口来调用 Laravel 的「模型工厂」填充数据,并且这个扩展只在开发和测试环境中安装,这样就可以提供统一的接口,也不用担心安全问题了。
说干就干,根据 用 TDD 的方式为 Laravel 开发扩展 的教程来新建一个扩展项目。
要点
我们需要两个路由分别对应「模型工厂」的 create
和 make
方法,通过这两个路由调用「模型工厂」对应的方法,并且可以传入自定义的模型参数和创建模型的数量。
额外的,还需要一个刷新数据库的路由来重置数据库。
测试怎么写
这个功能的实现其实很简单,但是测试怎么写才是重点,这里讲一讲在上一篇中没有提到的测试方法。
首先我们要模拟真实的应用,有 migration
有定义好的 factory
,但是扩展包本身是没有也不需要这些的,所以我们要在测试中加载测试用的 migration
和 factory
。
在 setUp
方法中加载:
protected function setUp(): void
{
parent::setUp();
$this->withoutExceptionHandling();
$this->withFactories(__DIR__.'/../Fixtures/factories');
$this->loadMigrationsFrom(__DIR__.'/../Fixtures/migrations');
}
这个两个方法的功能就是从文件夹里加载 migration
和 factory
,这些文件和正常的 Laravel 应用里的一样即可。
另外我们还需要一个模型来做测试,这个可以直接继承 Illuminate\Database\Eloquent\Model
方法来得到。
这样就可以像写普通的接口测试一样来写我们这个扩展的测试的了。
自动加载扩展
当别人在 composer 中引入了扩展之后,Laravel 提供了一个自动发现扩展的方法,这需要我们在 composer.json
进行一点额外的配置:
"extra": {
"laravel": {
"providers": [
"LaravelPro\\ReachSeeder\\ReachSeederServiceProvider"
]
}
},
这样 Laravel 就可以自动加载扩展了。
扩展地址:github.com/laravel-pro/reach-seede...
目前扩展还在初始开发阶段,有什么可以加入的功能欢迎大家来讨论。
本作品采用《CC 协议》,转载必须注明作者和本文链接