var ( sqliteDBConn *gorm.DB ) func GetInMemoryDB() *gorm.DB { return sqliteDBConn } func InitInMemoryDB() { var err error sqliteDBConn, err = gorm.Open(sqlite.Open(":memory:"), &gorm.Config{ DisableForeignKeyConstraintWhenMigrating: true, }) if err != nil { panic(err) } }
在单测启动前,调用 InitInMemoryDB
来初始化,拿到一个基于我们的内存 SQLite 生成的 *gorm.DB
对象,并通过 GetInMemoryDB
返回即可。
对于业务代码来说,我们只需要传入这个内存 SQLite 的 *gorm.DB
作为 MySQL 的平替,其他逻辑都不需要改变,非常方便。
当然,Fake 带来的另一个问题也需要解决。
你既然是 Fake,那等于说是个新的数据库,并没有我们此前在线上环境建好的那些数据表,我们如果直接跑测试,INSERT 数据的时候是要报错的。
此时我们可以直接把自己的 Model 指针传入 db.AutoMigrate 方法,GORM 会自行帮我们创建相关的表。
这样,完美替代mysql的数据库和表,就创建完毕,可以愉快的开始写单测了