如何对 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()
}
现在,在您的单元测试中,您可以创建 Context
和 Message
的实例并将其传递给您的函数。然而,在这种情况下,这几乎没有意义。您所做的只是记录和确认消息,这些功能应该由上游项目进行单元测试。因此,构建消息实例和单元测试 processMessage
.
更有意义
我有以下生产代码:
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()
}
现在,在您的单元测试中,您可以创建 Context
和 Message
的实例并将其传递给您的函数。然而,在这种情况下,这几乎没有意义。您所做的只是记录和确认消息,这些功能应该由上游项目进行单元测试。因此,构建消息实例和单元测试 processMessage
.