第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

欺騙 grpc UnaryHandler 在 Go 中進(jìn)行 gRPC 單元測試

欺騙 grpc UnaryHandler 在 Go 中進(jìn)行 gRPC 單元測試

Go
慕的地6264312 2023-07-17 14:50:15
我正在努力提高 Go gRPC 服務(wù)器的覆蓋范圍,但在為服務(wù)器的攔截器功能編寫測試時遇到了麻煩,因為我無法有意義地滿足該UnaryHandler類型。Interceptor我有一個具有以下簽名的函數(shù):Interceptor func(  ctx context.Context,  req interface{},  info *grpc.UnaryServerInfo,  handler grpc.UnaryHandler, // <- my issue comes from here) (interface{}, error)我假設(shè)任何 gRPC 方法都會滿足以下簽名UnaryHandler:type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)所以我嘗試傳遞帶有此簽名的方法:GetToken(ctx context.Context, req *AuthData) (*Token, error)我想象這會起作用,因為這就是攔截器實際上正在做的事情(轉(zhuǎn)發(fā)該 RPC),但由于某種原因 Go 抱怨:無法在攔截器的參數(shù)中使用 authService.GetToken (type func(context.Context, *AuthData) (*Token, error)) 作為類型 grpc.UnaryHandler我繼續(xù)編寫了一個正確滿足以下條件的虛擬函數(shù):func genericHandler(ctx context.Context, req interface{}) (interface{}, error) {    return req, nil}這很好,因為我在測試攔截器時并不特別需要運行任何特定方法。然而,我很好奇為什么實際方法不滿足約束,因為(根據(jù)我的理解)每當(dāng)我在野外調(diào)用該 RPC 時,它都會被傳遞到底層的攔截器函數(shù)。最可能的解釋是 grpc UnaryHandler 沒有做我想象的那樣,但是它做了什么?
查看完整描述

1 回答

?
茅侃侃

TA貢獻(xiàn)1842條經(jīng)驗 獲得超21個贊

不,函數(shù)


GetToken(ctx context.Context, req *AuthData) (*Token, error)

與以下類型不同


type UnaryHandler func(ctx context.Context, req interface{}) (interface{}, error)

InGetToken第二個參數(shù)req的類型為*AuthData,而 inUnaryHandler req的類型為interface{}。返回的*Token類型與 不同interface{}。這就是為什么不能GetToken直接傳遞給攔截器的原因。


在你的 grpc 服務(wù)中,你可以編寫類似的方法


GetToken(ctx context.Context, req *AuthData) (*Token, error)

作為處理程序來完成您的服務(wù)器工作。然而,它并不UnaryHandler像人們想象的那樣。


大部分轉(zhuǎn)換是由 grpc/protobuf 代碼生成器完成的。根據(jù)您的原型定義,它會生成一個接口,如下所示:


type XXXServer interface {

    GetToken(ctx context.Context, req *AuthData) (*Token, error)

}

您可以看到您的處理程序滿足的是這個接口(而不是 UnaryHander)。


在幕后,如果您查看xxx.pb.go生成的文件,您會發(fā)現(xiàn)一些_XXX_GetToken_Handler文件實際上正在執(zhí)行處理程序工作。在此函數(shù)中,(實際)UnaryHandler被定義為:


func _XXX_GetToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {

    // skip other preparations...

    // 

    handler := func(ctx context.Context, req interface{}) (interface{}, error) {

        return srv.(XXXServer).GetToken(ctx, req.(*AuthData))

    }

    return interceptor(ctx, in, info, handler)

}

在 this 內(nèi)部UnaryHandler,它將把您的服務(wù)器轉(zhuǎn)換為接口XXXServer,然后調(diào)用您的處理程序(您的代碼)。這顯示了如何interceptor調(diào)用它。


查看完整回答
反對 回復(fù) 2023-07-17
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號