0

我正在使用 GRPC/proto-buffers 在 GoLang 中编写我的第一个 API 端点。我对 GoLang 比较陌生。下面是在快乐情况下的 API:

$ grpcurl -d '{
    "field1": "A",
}' -plaintext localhost:11000 myteam.myprject.v1.MyProjectAPI/Endpoint

响应为成功:

{
    "message": "success"
}

以下是不愉快情况下的 API:

$ grpcurl -d '{}' -plaintext localhost:11000 myteam.myprject.v1.MyProjectAPI/Endpoint

响应失败:

ERROR:
  Code: InvalidArgument
  Message: Required parameter 'field1' not provided

根据我的应用程序功能,这是完全正确的行为,如下所示:

func (a *APIv1) Endpoint(ctx context.Context, msg *myprojectv1.EndpointRequest) (*myprojectv1.EndpointResponse, error) {
    if msg.Field1 == "" {
        return nil, status.Error(codes.InvalidArgument, "Required parameter 'field1' not provided")
    }
    return &myprojectv1.EndpointResponse{Message: "success"}, nil
}

我有以下两个测试用例来测试快乐路径和不快乐路径:

func TestEndpoint(t *testing.T) {
    myApiv1 := myprojecthandlersv1.New()

    t.Run("Success", func(t *testing.T) {
        res, err := myApiv1.Endpoint(context.Background(), &myprojectv1.EndpointRequest{
            Id: "A",
        })
        require.Nil(t, err)
        require.Equal(t, "success", res.Message)
    })

    t.Run("Missing argument id", func(t *testing.T) {
        _, err := myApiv1.Endpoint(context.Background(), &myprojectv1.EndpointRequest{
        })
        require.NotNil(t, err)
        require.Equal(t, codes.InvalidArgument, /* WHAT DO I PUT HERE?? */)
        require.Equal(t, "Required parameter 'field1' not provided", /* WHAT DO I PUT HERE?? */)
    })
}

但是我不知道如何测试测试用例中的错误值。如何测试Code==InvalidArgumentMessage== Required parameter 'field1' not provided

4

1 回答 1

1

您可以伪造与预期相同的错误,然后err像这样比较您得到的错误:

expectedErr := status.Error(codes.InvalidArgument, "Required parameter 'field1' not provided")

_, err := myApiv1.Endpoint(context.Background(), &myprojectv1.EndpointRequest{})
require.NotNil(t, err)
require.Equal(t, expectedErr, err)

要从err您那里获取错误消息和代码,可能需要使用反射,err就好像我没记错一样 gprcstatus将它们包装到自己的私有struct中,然后用于连接成单个格式字符串,code: FOO desc: BAR并且可以通过err.Error().

于 2020-05-26T03:39:25.543 回答