Я пишу небольшое CLI-приложение на Golang с использованием инфраструктуры urfave / cli и хотел бы написать для него тесты, но не могу найти никакой полезной информации о том, как тестировать CLI-приложения, специально написанные с помощью urfave./ Cli библиотека.У меня много флагов в приложении, и некоторые из них являются взаимоисключающими, и я хотел бы, чтобы над ними был правильный тест - есть ли у кого-нибудь идеи, как сделать это правильно?
РЕДАКТИРОВАТЬ: рассмотрим следующий минимальный пример приложения с несколькими флагами и ограничениями вокруг них.Как бы вы протестировали использование этих флагов (требования, эксклюзивность и т. Д.) И как они влияют на функции, когда они установлены или нет?
package main
import (
"errors"
"fmt"
"os"
"github.com/urfave/cli"
)
func doSomething(flag1 string, flag2 string, flag3 bool, flag4 bool) error {
err := errors.New("something")
return err
}
func main() {
app := cli.NewApp()
app.Name = "greet"
app.Usage = "fight the loneliness!"
var flag1, flag2 string
var flag3, flag4 bool
app.Flags = []cli.Flag{
cli.StringFlag{
Name: "flag1",
Value: "",
Usage: "flag1",
Destination: &flag1,
},
cli.StringFlag{
Name: "flag2",
Value: "",
Usage: "flag2",
Destination: &flag2,
},
cli.BoolFlag{
Name: "flag3",
Usage: "flag3",
Destination: &flag3,
},
cli.BoolFlag{
Name: "flag4",
Usage: "flag4",
Destination: &flag4,
},
}
app.Action = func(c *cli.Context) error {
if flag1 != "" && c.NumFlags() > 1 {
fmt.Println("--flag1 flag cannot be used with any other flags")
cli.ShowAppHelp(c)
os.Exit(1)
}
if flag1 == "" && flag2 == "" || c.NumFlags() < 1 {
fmt.Println("--flag2 is required")
cli.ShowAppHelp(c)
os.Exit(1)
}
if flag3 && flag4 {
fmt.Println("--flag3 and --flag4 flags are mutually exclusive")
cli.ShowAppHelp(c)
os.Exit(1)
}
err := doSomething(flag1, flag2, flag3, flag4)
return err
}
}