У меня есть метод, который возвращает ошибку с кодом состояния для некоторых входов. Я хочу проверить это в модульном тесте:
_, err := x.MyMethod(....)
if err == nil {
t.Error("Expected error")
}
e, ok := status.FromError(err)
assert.Equal(e.Code(), codes.ResourceExhausted, "....")
Но я вижу ошибку компиляции:
нельзя использовать e.Code() (значение типа code.Code) как assert.TestingT значение в аргументе для assert.Equal: коды. Код не реализует assert.TestingT (отсутствует метод Errorf)
Почему я не могу сравнить 2 значения? Сообщение об ошибке, по-видимому, означает, что каждый тип, который мне нужно сравнить, должен реализовывать assert.TestingT. e.Code() просто возвращает коды.Code из стандартной библиотеки go, и это uint32.
то есть assert.Equal(t, e.Code(), codes.ResourceExhausted, "....")
Понятно. Спасибо. Исходя из фона junit, их использование выглядит довольно странно.

Ошибка компиляции возникает из-за того, что функция assert.Equal ожидает, что ее первый аргумент реализует интерфейс TestingT, который предоставляет метод Errorf, используемый для сообщения об ошибках теста. Однако code.Code из пакета gRPC не реализует этот интерфейс, отсюда и ошибка.
Чтобы решить эту проблему, вы можете использовать assert.EqualValues вместо assert.Equal. Функция assert.EqualValues выполняет глубокое сравнение значений, не требуя первого аргумента для реализации интерфейса TestingT.
Вот как вы можете изменить свой модульный тест:
func TestMyMethod(t *testing.T) {
// Assuming x is an instance of the struct containing MyMethod
// ... code to set up test inputs ...
_, err := x.MyMethod(....)
if err == nil {
t.Error("Expected error")
}
e, ok := status.FromError(err)
if !ok {
t.Errorf("Expected gRPC status error")
}
assert.EqualValues(e.Code(), codes.ResourceExhausted, "Expected ResourceExhausted error code")
}
При использовании assert.EqualValues тест теперь будет корректно сравнивать значение code.Code без необходимости реализации интерфейса TestingT. Убедитесь, что у вас есть пакет github.com/stretchr/testify/assert, импортированный для работы функций утверждений.
package require может решить ошибку компиляции.
import (
"testing"
"github.com/stretchr/testify/require"
...
)
func TestMyMethod(t *testing.T) {
_, err := x.MyMethod(....)
if err == nil {
t.Error("Expected error")
}
e, ok := status.FromError(err)
require.Equal(t, codes.ResourceExhausted, e.Code(), "Expected ResourceExhausted error code")
}
Предполагая, что вы используете pkg.go.dev/github.com/stretchr/testify/assert#Equal , первый аргумент должен быть pkg.go.dev/github.com/stretchr/testify/assert#TestingT это то, что ошибка в основном говорит