为了账号安全,请及时绑定邮箱和手机立即绑定

使用 go-sqlmock 模拟 gorm `updates` 时出现错误?

使用 go-sqlmock 模拟 gorm `updates` 时出现错误?

Go
慕运维8079593 2022-05-23 17:27:19
存储库.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 文档一次,这可以节省您的时间。


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号