建立第一个单元测试(golang)-2(Day21)

接下来就是我要将测试放入现在正在进行的api中了

在这次的测试中,我想测试mRequest.Get()会不会回传资料库的所有request的值

而这次测试中,mRequest.Get()十分的单纯

func (r *MRequest) Get() (requests []Request, err error) {
	if findErr := r.db.Find(&requests).Error; findErr != nil {
		err = findErr
		return
	}
	return
}

而要预期资料库会不会回传所有的值,最直接的就是看,他有没有执行

select * from requests

只要执行了这段sql,就表示他在正常连线下可以取得requests的所有资料

那接着,我们要用
https://github.com/DATA-DOG/go-sqlmock
来对gorm进行mock
这个lib可以对大部分的sql的资料库进行mock,所以就不用自己重新制造轮子来mock里面的method了,而详细的用法可以到上述连结中进行查询
而我们这次使用的是ExpectQuery这个method,他可以帮你检查你是否有执行你想要的sql语法
用法如下

const sqlSelectAll = `SELECT * FROM "requests"`
mock.ExpectQuery(regexp.QuoteMeta(sqlSelectAll)).WillReturnRows(sqlmock.NewRows(nil))
_, err := r.Get()
Expect(err).ShouldNot(HaveOccurred())

这样就可以检查到他是否有执行SELECT * FROM "requests"这段内容了

至於说为什麽要使用regexp.QuoteMeta()这个method,是因为ExpectQuery中,他预设会认爲里面的内容是正规表达式,所以在这句sql语法中的*跟正规表达式里面的符号冲到了,因此如果想要预期里面直接是字串符合的话,就要加上regexp.QuoteMeta()来让你直接是跟这段内容相符,当然你也可以将判断句改为

select \* from "requests"

这样也是可以的

接着只要到model的资料夹下执行

go test .

或是到最外面执行

go test ./...

就可以看到这次测试的结果搂

以下附上这次的commit纪录
https://github.com/kevinyay945/smart-home-backend/tree/v0.3.1


<<:  Windows Server 2019 如何安装 IIS 运行 ASP.NET 专案

>>:  我的读书方法

Day 15 : 基础套件的介绍-os套件,帮助你管理资料(下)

今天继续来讨论OS 若想要得到当前路径,可以使用os.getcwd()。 import os pat...

Day13 X CSS GPU Acceleration

其实今天的主题应该算是昨天 High Performance CSS 的延伸。 大家应该都有遇过网...

【Day5】注册画面 X Firestore Database

昨天我们已经把登入画面做好了,大家有没有觉得万事起头难呢? 既然我们已经有登入画面了,当然要有注册...

Day 28 / DL x RL / RL 不只会打电动?

RL 比较知名的应用场合和研究成果大部分都分布於游戏、自驾车、和机器人领域。事实上 RL 可以有非常...

Python & Celery 学习笔记_重试策略 (retry)

本篇文章在介绍 celery 的重试策略,如果有问题或是错误,欢迎留言讨论!! 一、简介 稍微在网路...