2 回答

TA貢獻(xiàn)1794條經(jīng)驗 獲得超8個贊
您可以創(chuàng)建一個包裝消息的接口和一個包裝接收函數(shù)類型的函數(shù)。
// message interface to pass to our message handler
type Message interface {
GetData() []byte
Ack()
}
// real message for pubsub messages
type msg struct {
m *pubsub.Message
}
// returns real message data
func (i *msg) GetData() {
return i.m.Data
}
// acks the real pubsub message
func (i *msg) Ack() {
i.m.Ack()
}
// test message can be passed to the handleMessage function
type testMsg struct {
d []byte
}
// returns the test data
func (t *testMsg) GetData() []byte {
return d
}
// does nothing so we can test our handleMessage function
func (t *testMsg) Ack() {}
func main() {
client, err := pubsub.NewClient(context.Background(), "projectID")
if err != nil {
log.Fatal(err)
}
sub := client.Subscription("pubsub-sub")
sub.Receive(ctx, createHandler())
}
// creates the handler, allows us to pass our interface to the message handler
func createHandler() func(ctx context.Context, m *pubsub.Message) {
// returns the correct function type but uses our message interface
return func(ctx context.Context, m *pubsub.Message) {
handleMessage(ctx, &msg{m})
}
}
// could pass msg or testMsg here because both meet the interface Message
func handleMessage(ctx context.Context, m Message) {
log.Println(m.GetData())
m.Ack()
}

TA貢獻(xiàn)2039條經(jīng)驗 獲得超8個贊
您可以通過使用接口和模擬來做到這一點,如下所示。
// Create an interface that'll be implemented by *pubsub.Message
type message interface{
Ack()
}
// Accept the interface instead of the concrete struct
func processMessage(ctx context.Context, msg message) {
log.Printf("Processing message, data: %s", msg.Data)
msg.Ack()
}
現(xiàn)在,在測試文件中,創(chuàng)建一個模擬消息并確認(rèn)是否Ack被調(diào)用。您可以為此使用作證/模擬。
- 2 回答
- 0 關(guān)注
- 139 瀏覽
添加回答
舉報