随着GORM
库的引入,我们在数据库持久化上已经有了解决方案。但上一篇我们使用的GORM
过于简单,应用到实际的项目中局限性很大。
与此同时,我们也缺乏一个有效的手段来验证自己编写的相关代码。如果依靠连接到真实的MySQL
去验证功能,那成本实在太高。那么,这里我们就引入一个经典的sqlmock
框架,并配合对数据库相关代码的修改,来实现相关代码的可测试性。
v0.4.1:GORM库的适配sqlmock的单元测试
项目链接 https://github.com/Junedayday/micro_web_service/tree/v0.4.1
由于主要是针对GORM的小改动,所以增加了一个小版本号
目标
利用sqlmock工具,并对数据库相关代码进行修改,实现单元测试。
关键技术点
- Order相关代码的改造
- 引入sqlmock到测试代码
- 注意点讲解
目录构造
1 | --- micro_web_service 项目目录 |
1.Order相关代码的改造
我们要对Order相关的代码进行改造,来满足以下两个点:
- 可测试性,可以脱离对真实数据库连接的依赖
- 灵活的更新方法,可以支持对指定条件、指定字段的更新
1 | /* |
2.引入sqlmock到测试代码
sqlmock是检查数据库最常用的工具,我们先不管它使用起来的复杂性,先来看看怎么实现对应的测试代码:
1 | // 注意,我们使用的是gorm 2.0,网上很多例子其实是针对1.0的 |
3.注意点讲解
虽然添加了注释,我这边依旧讲一下修改的重点:
gorm.DB
作为一个初始化的参数,将其转变成一个依赖注入,使这块代码更具可测试性- 查询和更新采用了一个新的结构体
OrderFields
,是用里面的fields
声明了order
中哪个字段生效
GORM框架的进一步扩展
通过这一次对GORM数据库相关代码的迭代,还是可以发现有些不足:
- 对复杂SQL的支持不足:如group by、子查询等语句
- 对field这块限制不好,
id
,name
,price
,容易发生误填字段的问题 - 没有串联日志模块
接下来的模块,我会逐渐对2、3两点进行补充,而第1点需要有选择性地实现,我也会结合具体的场景进行分享。
总结
通过这一个小版本,我们让DAO
这个与数据库交互模块的代码更具可读性(从调用侧可以清楚地了解到要做什么)、健壮性(单元测试)和可扩展性(对后续字段的扩展也很容易支持)。
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili: https://space.bilibili.com/293775192
公众号: golangcoding