我正在使用GRPC/proto-buffers在GoLang中编写我的第一个API端点。我对果兰还是个新手。下面是我为我的测试用例编写的文件
package my_package
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"google.golang.org/protobuf/types/known/structpb"
"github.com/MyTeam/myproject/cmd/eventstream/setup"
v1handler "github.com/MyTeam/myproject/internal/handlers/myproject/v1"
v1interface "github.com/MyTeam/myproject/proto/.gen/go/myteam/myproject/v1"
)
func TestEndpoint(t *testing.T) {
conf := &setup.Config{}
// Initialize our API handlers
myhandler := v1handler.New(&v1handler.Config{})
t.Run("Success", func(t *testing.T) {
res, err := myhandler.Endpoint(context.Background(), &v1interface.EndpointRequest{
Data: &structpb.Struct{},
})
require.Nil(t, err)
// Assert we got what we want.
require.Equal(t, "Ok", res.Text)
})
}
下面是在上面包含的v1.go
文件中定义EndpointRequest
对象的方式:
// An v1 interface Endpoint Request object.
message EndpointRequest {
// data can be a complex object.
google.protobuf.Struct data = 1;
}
这似乎工作。
但是现在,我想做一些稍微不同的事情。在我的测试用例中,我不是发送一个空的data
对象,而是发送一个带有键/值对A: "B", C: "D"
的map/dictionary。我该怎么做?如果我用Data: &structpb.Struct{A: "B", C: "D"}
替换Data: &structpb.Struct{}
,我会得到编译器错误:
invalid field name "A" in struct initializer
invalid field name "C" in struct initializer
2条答案
按热度按时间gcuhipw91#
初始化
Data
的方式意味着您需要以下内容:但是,structpb.Struct的定义如下:
很明显这里有点不匹配。您需要初始化结构体的
Fields
Map,并使用正确的方式设置Value
字段。与您显示的代码等效的代码是:zpqajqem2#
使用structpb.NewStruct将
map[string]interface{}
转换为structpb.Struct
。