Как опросить объект ошибки внутри тестового примера GoLang? - PullRequest
0 голосов
/ 26 мая 2020

Я пишу свою первую конечную точку API в GoLang с использованием GRPC / proto-буферов. Я новичок в 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?

1 Ответ

1 голос
/ 26 мая 2020

Вы можете подделать ту же ошибку, что и ожидаете, а затем сравнить 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, как будто я правильно помню gpr c status оборачивает их в собственный частный struct, который затем используется для объединения в одну строку формата code: FOO desc: BAR, и это можно получить через err.Error() .

...