使用go-sqlmock获取SQL查询中的参数值

xu3bshqb  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(156)

我目前正在使用go-sqlmock来模拟我的数据库。
执行查询时,是否有任何方法可以获取已传递给sql驱动程序的值?例如,此处作为参数传递的arg变量:

import (
   "database/sql"
)

func retrieveInfo(){
    // this function returns an initialized instance of type *sql.DB
    DbDriver := initDb()

    query := "my query"
    arg := 3
    rows, err := Db_driver.Query(query, arg)
    // ...
}

然后我想测试这个函数,我想在测试时知道变量arg的值。我想这应该是可能的,因为它被传递给go-sqlmock创建的“假”驱动程序。我的测试逻辑如下所示:

import "github.com/DATA-DOG/go-sqlmock"

// Inits mock and overwrites the original driver
db, mock, err := sqlmock.New()
Db_driver = db

func TestRetrieveInfo(t *testing.T){
   // query that matchs the one in retrieveInfo()
   query := "..."
   queryRows := sqlmock.NewRows([]string{"column1, column2"}).FromCSVString("value1, value2")
   mock.ExpectQuery(query).WillReturnRows(queryRows)
}
kcwpcxri

kcwpcxri1#

您可以使用检测来 Package 真实的的驱动程序,以记录这些值。
使用软件包github.com/luna-duclos/instrumentedsql

lztngnrs

lztngnrs2#

您可以通过创建自己的Match方法来捕获arg值,例如:

type ArgCapture struct {
    CapturedValue driver.Value
}

func (a *ArgCapture) Match(value driver.Value) bool {
    a.CapturedValue = value

    return true
}

那么在你的测试中你会得到

capture := &ArgCapture{}
mock.ExpectQuery(query).WithArgs(argCapture).WillReturnRows(queryRows)

然后可以在capture.CapturedValue上执行Assert或其他操作

相关问题