记一次想简单化的单元测试
切换成内存数据库
记得开启 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 协议》,转载必须注明作者和本文链接
推荐文章: