Как сравнить значения в go unit test

У меня есть метод, который возвращает ошибку с кодом состояния для некоторых входов. Я хочу проверить это в модульном тесте:

_, 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.

Предполагая, что вы используете pkg.go.dev/github.com/stretchr/testify/assert#Equal , первый аргумент должен быть pkg.go.dev/github.com/stretchr/testify/assert#TestingT это то, что ошибка в основном говорит

Inian 26.07.2023 12:12

то есть assert.Equal(t, e.Code(), codes.ResourceExhausted, "....")

Inian 26.07.2023 12:13

Понятно. Спасибо. Исходя из фона junit, их использование выглядит довольно странно.

Mandroid 26.07.2023 12:15
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ошибка компиляции возникает из-за того, что функция 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")
}

Другие вопросы по теме