为cli输入编写测试

时间:2018-07-02 20:42:01

标签: unit-testing go

我有一个带有标志的cli的小型Go应用,要求我对其进行测试。

我的应用程序在命令行上像 deploy.exe <task> <command> -tenant tenant_name -validate -package "c:\some dir\\"

根据哪个taskcommand调用不同的执行路径,最终将另一个程序中的func命名为:

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

我只需要编写用于标记解析的单元测试,而无需最后调用实际函数。

我是Go的新手,我正在努力弄清楚如何实现这一目标。我曾考虑过将Os.Args()和Flag解析添加到一个接受输入并输出指向RunDBCmds(*tenant, ...)函数的指针的函数。但是,我只是不确定我能否完成返回指向函数的指针。

对于在不实际调用功能的情况下如何使我的代码更具可测试性的建议,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

如果所有任务/命令都具有不同的标志集,那么我最终会引入某种命令抽象。最好的示例可以在Go源代码本身中找到:

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

每个命令可以有自己的标志。FlagSet可以解析特定于命令的标志:

// 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
}

使用这种方法,您可以将命令的标志解析与执行分开。