登录
首页 >  Golang >  Go问答

解决sqlmock数据库关闭的问题

来源:stackoverflow

时间:2024-02-07 16:51:21 315浏览 收藏

知识点掌握了,还需要不断练习才能熟练运用。下面golang学习网给大家带来一个Golang开发实战,手把手教大家学习《解决sqlmock数据库关闭的问题》,在实现功能的过程中也带大家重新温习相关知识点,温故而知新,回头看看说不定又有不一样的感悟!

问题内容

我的问题是,当我在同一个函数中打开数据库两次时,与数据库的连接被关闭。

这是我需要测试的代码示例:

var opendb := func() *sql.db {
   db, _ := sql.open()
   return db
}

func dosomequery(id string) bool {
   var exists bool
   db := opendb()
   defer db.close()
   db.queryrow("... some query", id).scan(&exists)
   return exists
}

func totest() bool, bool {
   exists1 := dosomequery("run1")
   exists2 := dosomequery("run2")
   return exists1, exists2
}

这是我的测试示例:

func TestSomeTestName(t *testing.T) {
   db, mock, _ sqlmock.New()
   defer db.Close()
   var openDB := func() *sql.DB {
     return db
   }
   mock.ExpectQuery(some query for run1...)
   mock.ExpectQuery(some query for run2...)

   res1, res2 := toTest()

   assert.True(t, res1)
   assert.True(t, res2)
}

不,问题是第一个查询工作正常,但在第二个查询上我收到错误:database is close

有没有办法在不更改代码的情况下避免在第一次测试运行后关闭数据库?该代码在生产中有效,我只需要以某种方式测试它......


正确答案


我在测试中找到了一种方法

db, mock, dbError := sqlmock.New()
defer db.Close()
db2, mock2, dbError2 := sqlmock.New()
defer db2.Close()
assert.Nil(t, dbError)
assert.Nil(t, dbError2)
setUpDB = func() *sql.DB {
    if mock.ExpectationsWereMet() == nil {
        return db2
    }
    return db
}

理论要掌握,实操不能落!以上关于《解决sqlmock数据库关闭的问题》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>