【问题标题】:sqlmock database is closed issuesqlmock 数据库关闭问题
【发布时间】:2022-11-16 16:48:41
【问题描述】:

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

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

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 closed

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

【问题讨论】:

  • 对每个查询都进行打开/关闭操作既浪费又缓慢。 *sql.DB 意味着打开一次,然后在应用程序的整个生命周期中重复使用。

标签: go go-sqlmock


【解决方案1】:

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

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(ctx context.Context, read bool) *sql.DB {
    if mock.ExpectationsWereMet() == nil {
        return db2
    }
    return db
}

【讨论】:

    猜你喜欢
    • 2018-09-06
    • 2020-04-06
    • 2022-01-12
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2022-06-10
    • 2011-10-25
    • 2012-06-23
    相关资源
    最近更新 更多