记一次想简单化的单元测试
切换成内存数据库

记得开启 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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: