
我正在努力使用 sqlmock 和 gorm 为我的 go lambda 函数编写测试。
这是我要测试的功能:
func docleanup(con *gorm.db) {
sixmonthsago := time.now().adddate(0, -6, 0).format("2006-02-01")
con.where("date_to <= ?", sixmonthsago).delete(&availability{})
con.where("date_to <= ?", sixmonthsago).delete(&reservation{})
}这是我的测试:
func testdocleanup(m *testing.t) {
var mock sqlmock.sqlmock
var db *sql.db
var err error
db, mock, err = sqlmock.new()
assert.nil(m, err)
dialector := mysql.new(mysql.config{
dsn: "sqlmock_db_0",
drivername: "mysql",
conn: db,
skipinitializewithversion: true,
})
conn, err := gorm.open(dialector, &gorm.config{})
if err != nil {
m.errorf("failed to open connection to db: %v", err)
}
if conn == nil {
m.error("failed to open connection to db: conn is nil")
}
defer db.close()
mock.expectquery(fmt.sprintf("delete from availability where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01")))
mock.expectquery(fmt.sprintf("delete from reservations where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01")))
docleanup(conn)
err = mock.expectationsweremet()
assert.nil(m, err)
}我不知道我做错了什么。这是我第一次使用 sqlmock。我已经阅读了一些地方,我的代码看起来不错,但我没有得到结果。我的错误是:
Expected nil, but got: &errors.errorString{s:"there is a remaining expectation which was not matched: ExpectedQuery => expecting Query, QueryContext or QueryRow which:\n - matches sql: 'DELETE FROM availability WHERE date_to <= '2022-13-06''\n - is without arguments"}知道我做错了什么吗?
我看到的主要问题在于您期望查询的方式。而不是
mock.expectquery(fmt.sprintf("delete from availability where date_to <= '%s'", time.now().adddate(0, -6, 0).format("2006-02-01")))
你应该有:
现代化家居响应式网站模板源码是以cmseasy进行开发的家居网站模板。该软件可免费使用,模板附带测试数据!模板源码特点:整体采用浅色宽屏设计,简洁大气,电脑手机自适应布局,大方美观,功能齐全,值得推荐的一款模板,每个页面精心设计,美观大方,兼容各大浏览器;所有代码经过SEO优化,使网站更利于搜索引擎排名,是您做环保类网站的明确选择。无论是在电脑、平板、手机上都可以访问到排版合适的网站,即便是微信等
0
mock.expectbegin()
mock.expectexec("delete from `availability` where date_to <= ?").
withargs(time.now().adddate(0, -6, 0).format("2006-02-01")).
willreturnresult(sqlmock.newresult(0, 0))
mock.expectcommit()
这将告诉模拟您正在使用事务(expectbegin 和 expectcommit 围绕删除),查询是使用参数进行的(withargs),以及查询的返回结果是什么(willreturnresult)
还有一些其他的细微变化,例如表名周围的``(mysql 习惯用法)和表名(gorm 通常会将名称复数,因此您要么在 availability 上实现 tablename,要么默认为可用性)。
查看所有这些问题的最佳方法是更改 docleanup 以返回错误,然后在测试中查看它们:
func docleanup(con *gorm.db) error {
sixmonthsago := time.now().adddate(0, -6, 0).format("2006-02-01")
tx := con.where("date_to <= ?", sixmonthsago).delete(&availability{})
if tx.error != nil {
return tx.error
}
tx = con.where("date_to <= ?", sixmonthsago).delete(&reservation{})
if tx.error != nil {
return tx.error
}
return nil
}
...
err = docleanup(conn)
assert.nil(m, err)
...
这样做,并使用当前的代码,您将得到
Expected nil, but got: &errors.errorString{s:"call to database transaction Begin, was not expected, next expectation is: ExpectedQuery => expecting Query, QueryContext or QueryRow which:\n - matches sql: 'DELETE FROM availability WHERE date_to <= '2022-13-06''\n - is without arguments"}这告诉您 sqlmock 并不期望 begin,解决该问题后您将得到本答案第一部分中解决的其他错误。
以上就是使用 gorm 和 sqlmock 进行测试的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号