- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在 golang
中设置测试。
我使用 go-sqlmock
来测试 mysql 连接。
但是 sqlmock.NewRows
和 mock.ExpectQuery
不能正常工作并出现错误。
我想知道如何解决这个错误。
server side: golang
db: mysql
web framework: gin
dao.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
}
dao_test.go
func TestGetSingleArticleDao(t *testing.T) {
db, mock, err := sqlmock.New()
if err != nil {
t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
}
defer db.Close()
articleMockRows := sqlmock.NewRows([]string{"id", "uuid", "title", "content"}).
AddRow("1", "bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c", "test", "test")
mock.ExpectQuery("SELECT (.+) FROM articles where id=\\?").
WithArgs("1").
WillReturnRows(articleMockRows)
imageMockRows := sqlmock.NewRows([]string{"article_uuid", "image_name"}).
AddRow("bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c", "1a90696f-4fe7-48f5-81a5-ca72c129f4b0").
AddRow("bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c", "3d997272-468f-4b66-91db-00c39f0ef717")
mock.ExpectQuery("^SELECT (.+) FROM images*").
WithArgs("bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c").
WillReturnRows(imageMockRows)
resp := httptest.NewRecorder()
gin.SetMode(gin.TestMode)
ctx, _ := gin.CreateTestContext(resp)
article, imageRows := GetSingleArticleDao(ctx, db)
for imageRows.Next() {
imageName := util.ImageName{}
err := imageRows.Scan(&imageName.NAME)
if err != nil {
panic(err.Error())
}
article.IMAGENAMES = append(article.IMAGENAMES, imageName)
}
expectedArticle := util.Article{
ID: 1,
UUID: "bea1b24d-0627-4ea0-aa2b-8af4c6c2a41c",
TITLE: "test",
CONTENT: "test",
}
imageName1 := util.ImageName{
NAME: "1a90696f-4fe7-48f5-81a5-ca72c129f4b0",
}
expectedArticle.IMAGENAMES = append(expectedArticle.IMAGENAMES, imageName1)
imageName2 := util.ImageName{
NAME: "3d997272-468f-4b66-91db-00c39f0ef717",
}
expectedArticle.IMAGENAMES = append(expectedArticle.IMAGENAMES, imageName2)
assert.Equal(t, expectedArticle, article)
}
我希望 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
最佳答案
这是由以下部分引起的
resp := httptest.NewRecorder()
gin.SetMode(gin.TestMode)
ctx, _ := gin.CreateTestContext(resp)
我应该在 ctx 中添加 "id":"1"
参数。
所以我把那部分改成这样:
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}
关于mysql - 如何为 go-sqlmock 正确设置 Mock Row 和 Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57719304/
我想测试一些 SQL: select name from user where uid = ? 没关系,我可以这样模拟它: rows := sqlmock.NewRows([]string{“name
我无法获得与之相称的经历。我复制并粘贴了相同的查询,它甚至没有任何需要转义的字符。 我有以下代码: query := "SELECT id, user_id, name, description,
我正在尝试使用 sqlmock 使用 Gorm 为某些代码编写测试。我想出为我的插入功能编写测试,但现在我正在努力让更新工作。 工作流的第一部分只是从数据库中查询记录。即使日志输出显示它们相同,我也无
我无法测试任意使用数据库的函数 NewDao。我想检查返回的 Dao 是否既没有 nil client 也没有 nil product。 type Dao struct { client Clie
我使用 go-sqlmock ( https://godoc.org/github.com/DATA-DOG/go-sqlmock ) 来测试接收可变数量参数的函数(为了简单起见,我简化了函数并删除了
到这里。试图弄清楚如何使用SQL mock v2 . 这是我的界面: type OrderPersister interface { FetchOrderById(string) (*Orde
我有一个返回 2 个结果集的数据库查询,我想对执行此查询的 go 函数进行单元测试。虽然我可以像这样添加和测试行: myMockRows:=sqlmock.NewRows([]string{"col1
在尝试测试以下功能时: //Transaction Begins a sql transaction. func Transaction(db *sql.DB, txFunc func(*sql.Tx
我正在为 GoLang 应用程序编写测试用例,我正在使用 sqlmock 模拟 SQL 查询,但在执行 go test 时出现以下错误 Params: [调用查询,不是预期的,下一个预期是:Expec
我目前正在使用 go-sqlmock模拟我的数据库。 有什么方法可以在执行查询时获取已传递给 sql 驱动程序的值吗?就像这里作为参数传递的 arg 变量: import ( "database
我正在 golang 中设置测试。 我使用 go-sqlmock 来测试 mysql 连接。 但是 sqlmock.NewRows 和 mock.ExpectQuery 不能正常工作并出现错误。 我想
我能够像这样成功地模拟查询以从一个表中进行选择: sqlMock.ExpectQuery("^SELECT DISTINCT (.+) FROM myTable1, myTable2").
存储库.go func (repo *Repository) Update(info *model.Requests) error{ if info == nil{ return n
我是一名优秀的程序员,十分优秀!