我正在努力提高 Go gRPC 服务器的覆盖范围,但在为服务器的拦截器功能编写测试时遇到了麻烦,因为我无法有意义地满足该UnaryHandler类型。
Interceptor我有一个具有以下签名的函数:
Interceptor func(
ctx context.Context,
req interface{},
info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler, // <- my issue comes from here
) (interface{}, error)
我假设任何 gRPC 方法都会满足以下签名UnaryHandler:
type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)
所以我尝试传递带有此签名的方法:
GetToken(ctx context.Context, req *AuthData) (*Token, error)
我想象这会起作用,因为这就是拦截器实际上正在做的事情(转发该 RPC),但由于某种原因 Go 抱怨:
无法在拦截器的参数中使用 authService.GetToken (type func(context.Context, *AuthData) (*Token, error)) 作为类型 grpc.UnaryHandler
我继续编写了一个正确满足以下条件的虚拟函数:
func genericHandler(ctx context.Context, req interface{}) (interface{}, error) {
return req, nil
}
这很好,因为我在测试拦截器时并不特别需要运行任何特定方法。然而,我很好奇为什么实际方法不满足约束,因为(根据我的理解)每当我在野外调用该 RPC 时,它都会被传递到底层的拦截器函数。
最可能的解释是 grpc UnaryHandler 没有做我想象的那样,但是它做了什么?
茅侃侃
相关分类