Как я могу хранить различные реализации интерфейса ошибок вместе, а затем использовать их для сравнения типов в Go? - PullRequest
1 голос
/ 25 октября 2019

Я пытаюсь написать табличный тест на ходу, где контрольные примеры приведут к различным ошибкам. Затем я хочу проверить, соответствует ли тип ошибки типу ошибки, определенному в тестовом примере, используя errors.As(). Каждый тестовый случай определяется структурой, поэтому в структуре должен быть тип, который может содержать любую реализацию интерфейса error, что также позволяет проверить, что в тесте был возвращен правильный тип.

Я попытался определить структуру следующим образом

type testCase struct {
        testInput string
        expectedError error
}

У меня также есть ряд пользовательских ошибок, которые реализуют интерфейс error, скажем, одна называется myCustomError

Затем я объявляю переменную этой структуры следующим образом:

mTest := testCase{
        testInput: "some failing string",
        expectedError: myCustomError{},
}

, если затем я выполню тест следующим образом ...

err := someFunc(mTest.testInput)
if errors.As(err, &mTest.expectedError) {
        // test have succeeded
}

... оператор if будетвсегда возвращаю true, независимо от того, какой из моих пользовательских типов ошибок возвращается.

Я сделал минимальный пример, если это поведение на игровой площадке Go здесь: https://play.golang.org/p/uMdbMvfcdQi

В примере с игровой площадкой я ожидаю, что строка «соответствует myError1» будет напечатана дважды,но вместо этого оно также соответствует myError2, когда значение сохраняется как обычное значение error, прежде чем оно будет использовано для проверки типа переменной err.
Можно ли вообще сделать что-то подобное?

1 Ответ

1 голос
/ 25 октября 2019

Сохранить указатель на целевое значение в тестовом примере.

type testCase struct {
    testInput string
    expectedError interface{}
}

mTest := testCase{
    testInput: "some failing string",
    expectedError: &myCustomError{},
}

err := someFunc(mTest.testInput)
if errors.As(err, mTest.expectedError) {
    // test have succeeded
}

Минимальный пример: https://play.golang.org/p/igJy9L_ui73

...