флаг указан, но не определен: -test.v - PullRequest
1 голос
/ 15 февраля 2020

Сбой модульного теста для следующего кода:

Это мой основной код:

package locprovider

import (
    "encoding/json"
    "fmt"
    "net/http"

    "api/domain/location"
    "api/utils/error"
    "github.com/mercadolibre/golang-restclient/rest"
)

const (
    getCountryUrl = "https://api.mercadolibre.com/countries/%s"
)

func GetCountry(countryId string) (*location.Country, *error.ApiError) {

    response := rest.Get(fmt.Sprintf(getCountryUrl, countryId))
    if response == nil || response.Response == nil {
        return nil, &error.ApiError {
            Status: http.StatusInternalServerError,
            Message: fmt.Sprintf("invalid restclient response when trying to get country %s", countryId),
        }
    }

    if response.StatusCode > 299 {
        var apiError error.ApiError
        if err := json.Unmarshal(response.Bytes(), &apiError); err != nil {
            return nil, &error.ApiError {
                Status: http.StatusInternalServerError,
                Message: fmt.Sprintf("invalid error response when getting country %s", countryId),
            }
        }
        return nil, &apiError
    }

    var result location.Country
    if err := json.Unmarshal(response.Bytes(), &result); err != nil {
        return nil, &error.ApiError {
            Status: http.StatusInternalServerError,
            Message: fmt.Sprintf("error when trying to unmarshal country data for %s", countryId),
        }
    }

    return &result, nil
}

Это код моего модульного теста:

package locprovider

import (
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestGetCountryRestClientError(t *testing.T) {
    // Execution:
    country, err := GetCountry("AR")

    // Validation:
    assert.Nil(t, country)
    assert.NotNil(t, err)
    assert.EqualValues(t, 500, err.Status)
    assert.EqualValues(t, "invalid restclient response when trying to get country AR", err.Message)
}

Когда я выполнить этот модульный тест, я сталкиваюсь с следующей ошибкой, и я не уверен, почему это происходит.

У меня есть несколько других модульных тестов из другого пакета go, и они прекрасно работают без этой ошибки.

GOROOT = / usr / local / Cellar / go / 1.13.3 / libexe c #gosetup GOPATH = / Users / abc / go -testing #gosetup / usr / local / Cellar /go/1.13.3/libexec/bin/go test - c -o / private / var / folder / r0 / f7kkkm9526lgfz6jtgtphyww0000gn / T / ___ TestGetCountryRestClientError_in_api_provider_locprovider local_locer / usp gopeserp / /1.13.3/libexec/bin/go инструмент test2 json -t / private / var / folder / r0 / f7kkkm9526lgfz6jtgtphyww0000gn / T / ___ TestGetCountryRestClientError_in_api_provider_locprovider -tryt_tint_setup_setup_set_set_set_set_set_set_set_set_set_set_set_set_set_set_set_set_W_W_W_R_W_W_R_0_ru_g_ru_ru_ru_tr_t_0_ru определение: -test.v Использование / private / var / folder / r0 / f7kkkm9526lgfz6jtgtphyww0000gn / T / ___ TestGetCountryRestClientError_in_api_provider_locprovider: -mock Используйте флаг «mock», чтобы указать, что пакет должен использовать mock. Процесс завершен с кодом выхода 1

1 Ответ

2 голосов
/ 15 февраля 2020

Это похоже на golang / go выпуск 33869 , что, в свою очередь, указывало на go / issue 31859 ​​"тестирование: pani c в Init, если flag.Parse уже был вызван « и эта Go 1.13 инструкция

Флаги тестирования теперь зарегистрированы в новой функции Init, которая вызывается сгенерированной основной функцией для теста .
В результате, флаги тестирования теперь регистрируются только при запуске тестового двоичного файла, и пакеты, которые вызывают flag.Parse во время инициализации пакета, могут привести к сбою тестов.

...