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

存储库.go


func (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.go


func 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)

      }

   }

}


慕运维8079593
浏览 208回答 1
1回答

呼唤远方

原因是您没有转义查询字符串的正则表达式。Sqlmock 期望正则表达式符合您的期望。现在,如果您想匹配精确的查询字符串,而不是它的一部分。您可以指定一个 sqlmock 模拟选项,如下所示:db, mock, err := sqlmock.New(sqlmock.QueryMatcherOption(sqlmock.QueryMatcherEqual))答案在文档中,如果您阅读 api 文档一次,这可以节省您的时间。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go