如何对pubsub进行单元测试以接收回调

问题描述 投票:0回答:1

我有以下生产代码:

func pullMessages(ctx context.Context, sub *pubsub.Subscription) {
    err := sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
        log.Printf("Got message: %q\n", string(msg.Data))
        processMessage(msg)
        msg.Ack()
    })
    if err != nil {
        log.Printf("Receive: %v", err)
    }
}

如何验证processMessage是否在单元测试中真正被调用?

unit-testing go callback google-cloud-pubsub
1个回答
1
投票

非常简单:将您的回调命名为函数而不是匿名函数:

func pullMessages(ctx context.Context, sub *pubsub.Subscription) {
    if err := sub.Receive(ctx, rcvCallback); err != nil {
        log.Printf("Receiving message: %s",err)
    }
}

func rcvCallback (ctx context.Context, msg *pubsub.Message) {
        log.Printf("Got message: %q\n", string(msg.Data))
        processMessage(msg)
        msg.Ack()
}

现在,在单元测试中,您可以创建ContextMessage的实例并将其传递给函数。但是,在这种情况下,这几乎没有道理。您要做的只是记录和确认消息,这些功能应该由上游项目进行单元测试。因此,构造消息实例和单元测试processMessage会更有意义。

© www.soinside.com 2019 - 2024. All rights reserved.