searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

golang单元测试 数据库对象fake

2024-11-14 09:41:51
2
0

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的数据库和表,就创建完毕,可以愉快的开始写单测了

0条评论
0 / 1000
****伟
4文章数
0粉丝数
****伟
4 文章 | 0 粉丝
原创

golang单元测试 数据库对象fake

2024-11-14 09:41:51
2
0

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的数据库和表,就创建完毕,可以愉快的开始写单测了

文章来自个人专栏
单元测试
2 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0