存储库.gofunc (repo *Repository) Update(info *model.Requests) error{ if info == nil{ return nil } columnChanges := map[string]interface{}{ status: “completed", } if err := repo.db.Table(“requests").Model(info).Where(fmt.Sprintf("%s = ? AND %s = ? AND %s = ? AND %s = ?", requestID, systemID, requestType, status),info.RequestID, info.SystemID, info.RequestType,”progress").Updates(columnChanges).Error; err != nil { return err } return nil}嘲笑repository_test.gofunc TestRepository_Update(t *testing.T) { type testData struct { input *model.Requests queryString string queryArgs []driver.Value updateErr error hasErr bool } db, mock, _ := sqlmock.New() defer db.Close() dbInstance, _ := gorm.Open("postgres", db) testDataList := []testData{ { input: &model.Requests{ RequestID: 4, SystemID: 2, RequestType: “mobile", Status: “completed", }, queryString: `UPDATE "requests" SET "status" = $1 WHERE (“request_id" = $2 AND “system_id" = $3 AND “request_type" = $4 AND "status" = $5) `, queryArgs: []driver.Value{“completed", 2, 4, “mobile", “progress"}, updateErr: nil, hasErr: false,},} for _, data := range testDataList { repo := Repository(zerolog.Nop(), dbInstance) if data.queryString != "" { mock.ExpectBegin() m := mock.ExpectExec(data.queryString).WithArgs(data.queryArgs...) if data.hasErr { m.WillReturnError(data.updateErr) } else { m.WillReturnResult(sqlmock.NewResult(1, 1)) } mock.ExpectCommit() } resultErr := repo.Requests(data.input) if data.hasErr { assert.NotNil(t, resultErr) } else { assert.Nil(t, resultErr) //Error thrown in this line } if err := mock.ExpectationsWereMet(); err != nil { t.Errorf("there were unfulfilled expectations: %s", err) } }}
1 回答

呼唤远方
TA贡献1856条经验 获得超11个赞
原因是您没有转义查询字符串的正则表达式。Sqlmock 期望正则表达式符合您的期望。
现在,如果您想匹配精确的查询字符串,而不是它的一部分。您可以指定一个 sqlmock 模拟选项,如下所示:
db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))
答案在文档中,如果您阅读 api 文档一次,这可以节省您的时间。
- 1 回答
- 0 关注
- 207 浏览
添加回答
举报
0/150
提交
取消