Gomock не работает для отправки данных в базу данных тараканов

# #unit-testing #go #gomock

Вопрос:

Я пишу модульный тест для функции, которая вызывает подпрограмму для отправки данных в базу данных тараканов. Я пытаюсь высмеять вызов базы данных тараканов, который, похоже, не работает.Тестовый случай приводит к тайм-ауту точно так же, как это было бы, если бы не было насмешек над отправкой в базу данных тараканов.

вот функции:

 func DrainQueue() {  for range time.Tick(time.Second * time.Duration(1)) {  if q.Length() gt; 0 {  var queuedItems []interface{}   // Read the queue up to the size specified.  for qlen := 0; qlen lt; QueueSize amp;amp; q.Length() gt; 0; qlen   {  itemFromQueue := q.Pop()   queuedItems = append(queuedItems, itemFromQueue)  }   logging.Debug("Sending to cockroachDB...")   go SendToCockRoachDB(queuedItems...)  queuedItems = nil  }  } }  func SendToCockRoachDB(toSend ...interface{}) ([][][]byte, int64, error) {  var nor int64  var qErr error  var rows pgx.Rows  var results = make([][][]byte, 0)   batch := amp;pgx.Batch{}  for _, item := range toSend {  qs := item.(*QueryStruct)   batch.Queue(qs.Query, qs.Items...)  }   // Send to cockroachDB  br := dbConn.dbpool.SendBatch(dbConn.ctx, batch)  defer br.Close()   rows, qErr = br.Query()   if qErr != nil {  return nil, 0, qErr  }   for rows.Next() {  results = append(results, rows.RawValues())  }   nor  = rows.CommandTag().RowsAffected()   if nor gt; 0 {  logging.Log.Printf("Inserted: %d rows", nor)  }  return results, nor, qErr }  

Созданная мной тестовая функция работает следующим образом:

 func TestDrainQueue(t *testing.T) {   var results = make([][][]byte, 0)  var nor int64 = 0    controller := gomock.NewController(t)  defer controller.Finish()   mockSendBatch := Mocks.NewMockValues(controller)  mockSendBatch.EXPECT().SendToCockRoachDB(mockSendBatch).Return(results, nor, nil)   DrainQueue() }  

Я создал макет функции, используя gomock для SendToCockRoachDB, и вызвал его в модульном тесте

Комментарии:

1. Похоже, вы вообще не переходите mockSendBatch в тестируемый код. Вы должны поменять реальную базу данных на макет объекта в тесте с помощью интерфейса.

2. Можно ли издеваться над забавой без какого-либо интерфейса?

3. Возможно, существуют некоторые библиотеки, которые пытаются выполнить исправление обезьян, но они не переносимы.