我正在为调用 goroutine 将数据发送到 cockroach db 的函数编写单元测试。我正在尝试模拟对 cockroach db 的调用,这似乎不起作用。测试用例导致超时的方式与没有对 sendBatch 到 cockroach db 进行模拟的方式完全相同。
以下是功能:
func DrainQueue() {
for range time.Tick(time.Second * time.Duration(1)) {
if q.Length() > 0 {
var queuedItems []interface{}
// Read the queue up to the size specified.
for qlen := 0; qlen < QueueSize && q.Length() > 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 := &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 > 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 创建了一个模拟函数,并在单元测试中调用了它