Написание тестов для кли ввода - PullRequest
0 голосов
/ 02 июля 2018

У меня есть небольшое приложение Go с cli, использующим флаги, и меня попросили сделать его более тестируемым.

Мое приложение вызывается из командной строки, как deploy.exe <task> <command> -tenant tenant_name -validate -package "c:\some dir\\"

На основании которых task и command вызывается другой путь выполнения, и, в конечном итоге, функция, находящаяся в другом пакете, называется:

if command == "db" {
     dbhelper.RunDBCmds(*tenant, *validate, *package)
}

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

Я довольно новичок в Go и изо всех сил пытаюсь понять, как этого добиться. Я думал о добавлении моего разбора Os.Args () и Flag в функцию, которая принимает входные данные и выводит своего рода указатель на функцию RunDBCmds(*tenant, ...). Тем не менее, я просто не уверен, что смогу вернуть указатель на функцию.

Буду признателен за любые советы о том, как сделать мой код более тестируемым без фактического вызова функций.

1 Ответ

0 голосов
/ 04 июля 2018

Если бы все ваши задачи / команды имели разные наборы флагов, я бы закончил с введением некоторой абстракции Команды. Лучший пример можно найти в самом исходном коде Go:

base.Commands = []*base.Command{
        work.CmdBuild,
        clean.CmdClean,
        doc.CmdDoc,
        envcmd.CmdEnv,
        bug.CmdBug,
        fix.CmdFix,
        //...
}

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

// A Command is an implementation of a go command
// like go build or go fix.
type Command struct {
    // Run runs the command.
    // The args are the arguments after the command name.
    Run func(cmd *Command, args []string)

    // UsageLine is the one-line usage message.
    // The first word in the line is taken to be the command name.
    UsageLine string

    // Short is the short description shown in the 'go help' output.
    Short string

    // Long is the long message shown in the 'go help <this-command>' output.
    Long string

    // Flag is a set of flags specific to this command.
    Flag flag.FlagSet

    // CustomFlags indicates that the command will do its own
    // flag parsing.
    CustomFlags bool
}

Используя этот подход, вы можете отделить разбор флагов команд от исполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...