Как отключить флаги посещенных в командной строке в GoLang для тестов

Я пытаюсь запустить тесты, которые вызывают одну и ту же функцию несколько раз с разными аргументами каждый раз. Это приложение, которое принимает разные флаги командной строки. Если флаг командной строки не указан, используется значение по умолчанию.

flagset = make(map[string]bool)
flagset["flag1"] = false
flagset["flag2"] = false
flagset["flag3"] = false
flagset["flag4"] = false
func LoadCommandLineArguments(args []string) error{
        err := flag.CommandLine.Parse(args)
        /*Do error handling
         */
       flag.Visit(func(f *flag.Flag) { flagset[f.Name] = true })
       // Iterate through all the flags and set their default values whatever was not passed on the commandline.
}

func resetFlags(){
/* Reset flag variables to their original default values and set map values to false */
flagset["flag1"] = false
flagset["flag2"] = false
flagset["flag3"] = false
flagset["flag4"] = false
}

У меня есть разные тестовые функции, каждая из которых предоставляет разные флаги для тестов. Например: так выглядит мой тестовый файл

func TestFlag1(t *testing.T) {
   resetFlags()
   err := LoadCommandLineArguments([]string{"-flag1=somevalue1"})
}
func TestFlag2(t *testing.T) {
resetFlags()
err := LoadCommandLineArguments([]string{"-flag2=somevalue2"})
}
func TestFlag3(t *testing.T) {
resetFlags()
err := LoadCommandLineArguments([]string{"-flag3=somevalue3"})
}
func TestFlag4(t *testing.T) {
resetFlags()
err := LoadCommandLineArguments([]string{""})
}

Всякий раз, когда я запускаю свой тестовый файл и каждый модульный тест по отдельности, все они работают нормально. Но когда я запускаю весь тестовый файл файла вместе, к тому времени, когда он достигает testFlag4, в LoadCommandLineArguments он посещает все флаги и думает, что все они были переданы в командной строке, хотя я сбрасываю их в начале каждой тестовой функции. .

В TestFlag1 он считает, что flag1 пройден.

В TestFlag2 он считает, что flag1 и flag2 переданы.

В TestFlag3 он считает, что flag1, flag2, flag3 были переданы.

Точно так же в TestFlag4 он думает, что flag1 также был передан, flag2 также был передан, flag3 также был передан, когда я ничего не передал. Я хочу, чтобы в этом тесте не проходили флаги командной строки. Функция flags.Visit не должна иметь возможность получить истинное значение ни для одного из флагов.

Я знаю, что, устанавливая значения моей карты на false, я на самом деле не отменяю переданные значения командной строки, но как это сделать?

Есть ли способ Не посещать / Снять флаги командной строки в Golang? Любая помощь будет оценена по достоинству.

Спасибо.


person jkasper    schedule 17.09.2019    source источник


Ответы (1)


Основываясь на исходном коде флага, это должно работать (вам нужно будет добавить os к вашему импорту):

flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) //flags are now reset

И еще пара вещей, касающихся стиля:

Карты возвращают значение по умолчанию, если ключ не найден. Таким образом, все эти строки инициализации / сброса могут быть удалены.

flagset = make(map[string]bool)
// the initialization lines are not needed; bool already initalizes to false:
//flagset["flag1"] = false
//...

func LoadCommandLineArguments(args []string) error{
   //...
}

func resetFlags(){
   /* Reset flag variables */
   flagset = make(map[string]bool)//just make a new map
}
person VolatileCoder    schedule 17.09.2019
comment
Значит, я должен писать flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError) в своей resetFlags() функции, которая вызывается в каждой из тестовых функций? Или мне следует поместить это в свой main.go файл? - person jkasper; 17.09.2019
comment
Поскольку он используется только в ваших тестах, я бы создал функцию в вашем пакете _test. Это ненормальное / нежелательное поведение. - person VolatileCoder; 17.09.2019
comment
Итак, теперь, когда я вызываю эту функцию, которая сбрасывает флаги в каждом из моих тестов, она говорит flag provided but not defined: flag1. - person jkasper; 17.09.2019
comment
Вам необходимо переопределить флаги после того, как вы сбросите их. - person VolatileCoder; 17.09.2019
comment
Отличная идея. Спасибо! - person jkasper; 17.09.2019