# #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. Возможно, существуют некоторые библиотеки, которые пытаются выполнить исправление обезьян, но они не переносимы.