如何正确设置go-sqlmock的Mock Row和Query

jps*_*.v5 6 mysql unit-testing go go-gin go-sqlmock

我正在设置测试golang
我用来go-sqlmock测试mysql连接。
但是sqlmock.NewRowsmock.ExpectQuery不能很好地处理错误。
我想知道如何解决这个错误。

server side: golang
db: mysql
web framework: gin
Run Code Online (Sandbox Code Playgroud)

道戈

server side: golang
db: mysql
web framework: gin
Run Code Online (Sandbox Code Playgroud)

dao_test.go

func GetSingleArticleDao(c *gin.Context, db *sql.DB) (util.Article, *sql.Rows) {
    id := c.Params.ByName("id")
    article := util.Article{}
    errArticle := db.QueryRow("SELECT * FROM articles WHERE id = ?", id).Scan(&article.ID, &article.UUID, &article.TITLE, &article.CONTENT)
    if errArticle != nil {
        panic(errArticle.Error())
    }
    rows, errImage := db.Query("SELECT image_name FROM images WHERE article_uuid  = ?", article.UUID)
    if errImage != nil {
        panic(errImage.Error())
    }

    return article, rows
}
Run Code Online (Sandbox Code Playgroud)

我希望go test -v运行没有错误。
但实际情况并非如此。
这是错误。

$ go test -v 
=== RUN   TestGetSingleArticleDao
--- FAIL: TestGetSingleArticleDao (0.00s)
panic: Query: could not match actual sql: "SELECT * FROM articles WHERE id = ?" with expected regexp "SELECT (.+) FROM articles where id=\?" [recovered]
        panic: Query: could not match actual sql: "SELECT * FROM articles WHERE id = ?" with expected regexp "SELECT (.+) FROM articles where id=\?"

goroutine 34 [running]:
testing.tRunner.func1(0xc00022c000)
        /usr/local/go/src/testing/testing.go:830 +0x392
panic(0x165a960, 0xc0001bc4a0)
        /usr/local/go/src/runtime/panic.go:522 +0x1b5
article/api/dao.GetSingleArticleDao(0xc000214160, 0xc0002180c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
        /Users/jpskgc/article/api/dao/dao.go:26 +0x35d
article/api/dao.TestGetSingleArticleDao(0xc00022c000)
        /Users/jpskgc/article/api/dao/dao_test.go:92 +0x750
testing.tRunner(0xc00022c000, 0x1788730)
        /usr/local/go/src/testing/testing.go:865 +0xc0
created by testing.(*T).Run
        /usr/local/go/src/testing/testing.go:916 +0x35a
exit status 2
FAIL    article/api/dao 0.030s
Run Code Online (Sandbox Code Playgroud)

jps*_*.v5 0

这是由以下部分引起的

    resp := httptest.NewRecorder()
    gin.SetMode(gin.TestMode)
    ctx, _ := gin.CreateTestContext(resp)
Run Code Online (Sandbox Code Playgroud)

我应该"id" :"1"在 ctx 中添加参数。
所以我把那部分改成了这样:

    param := gin.Param{"id", "1"}
    params := gin.Params{param}
    req, _ := http.NewRequest("GET", "/article/1", nil)
    var context *gin.Context
    context = &gin.Context{Request: req, Params: params}
Run Code Online (Sandbox Code Playgroud)