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

How to unit test pubsub Receive callback

我有以下生产代码:

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 是否确实在单元测试中被调用?

非常简单:让你的回调成为一个命名函数而不是匿名函数:

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.

更有意义