如何询问 GoLang 测试用例中的错误对象?
How to interrogate an error object inside a GoLang Test case?
我正在使用 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
== InvalidArgument
和 Message
== Required parameter 'field1' not provided
?
您可以像预期的那样伪造相同的错误,然后比较 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
上使用反射,就好像我没有记错 gprc status
将它们包装到自己的私有 struct
然后用于连接成格式为 code: FOO desc: BAR
的单个字符串,可以通过 err.Error()
.
获得
我正在使用 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
== InvalidArgument
和 Message
== Required parameter 'field1' not provided
?
您可以像预期的那样伪造相同的错误,然后比较 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
上使用反射,就好像我没有记错 gprc status
将它们包装到自己的私有 struct
然后用于连接成格式为 code: FOO desc: BAR
的单个字符串,可以通过 err.Error()
.