0

我正在为调用 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 创建了一个模拟函数,并在单元测试中调用了它

4

0 回答 0