Wie kann ich die unit-test-Kommandozeilen-flags in Gehen?
Möchte ich einen unit test, der überprüft, ein bestimmtes command line flag ist innerhalb einer Aufzählung.
Hier ist der code, den ich gerne zum schreiben von tests vor:
var formatType string
const (
text = "text"
json = "json"
hash = "hash"
)
func init() {
const (
defaultFormat = "text"
formatUsage = "desired output format"
)
flag.StringVar(&formatType, "format", defaultFormat, formatUsage)
flag.StringVar(&formatType, "f", defaultFormat, formatUsage+" (shorthand)")
}
func main() {
flag.Parse()
}
Den gewünschten test bestehen würde, nur, wenn-format erreicht eine der const-Werte oben angegeben. Dieser Wert verfügbar sein würden formatType. Ein Beispiel richtige Aufruf wäre: Programm -format text
Was ist der beste Weg, um zu testen, das gewünschte Verhalten?
Hinweis: Vielleicht habe ich diese schlecht formuliert, aber der angezeigte code nicht dem unit test an sich, aber den code möchte ich schreiben unit-tests vor. Dies ist ein einfaches Beispiel aus dem tool, das ich Schreibe, und wollte Fragen, ob es eine gute Möglichkeit zu testen, gültige Eingaben für das Werkzeug.
- IMHO ist dies nicht ein Gerät zu testen: Dieses ist gerade einige einfache code läuft nach dem Parsen der Kommandozeilen-flags. "Unit-tests" im Gehen geschrieben, mit dem Test-Paket finden Sie unter golang.org/doc/code.html#Testing, aber diese tests nicht ausführen, bei Start der Anwendung. Wie wäre es mit einem einfachen
if formatType!=text && .. && foramtType!="hash" { log.Fatalf("You learn read man page...") }
? - Was gezeigt wird, ist nicht die unit Tests selbst, aber den code möchte ich ausführen von unit-tests vor.
- Beide Antworten zeigen Ihnen einen Weg, um test für die Prüfung der gesetzten flags. Was ist dein problem?
- Keine. Der erste Kommentar, als ich es gelesen habe, sagt, dass der code oben ist nicht eine Einheit testen. Was wahr ist, ist es nicht, und das wollte ich klären.
- Diese Frage zeigt, hoch in der Google-Ergebnisse. Ich war auf der Suche nach Lösung zum gleichen Problem. @VonC hat eine einfache Lösung für unit-Test-command-line arguments: [stackoverflow.com/a/26024595/197633]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Benutzerdefinierte Prüfung und Verarbeitung der flags kann erreicht werden, mit der
- flag.Var
Funktion in derflag
Paket.Flagge.Var "definiert ein flag mit dem angegebenen Namen und die Verwendung von string. Die Art und den Wert der flag vertreten sind, durch das erste argument vom Typ Wert, die in der Regel hält eine benutzerdefinierte Implementierung von Wert."
Einen
- flag.Wert
ist jede Art erfüllt, dass dieValue
- Schnittstelle, definiert als:Gibt es ein gutes Beispiel in der example_test.gehen Datei in der
flag
Paket-QuelleFür Ihren Fall könnten Sie so etwas wie:
Dies ist wahrscheinlich übertrieben für so ein einfaches Beispiel, aber kann sehr nützlich sein bei der Definition komplexer flag-Typen (Die verlinkten Beispiel wird ein Komma-separierte Liste von Intervallen in einer Scheibe einen benutzerdefinierten Typ basierend auf
time.Duration
).EDIT: In Antwort auf, wie man unit-tests gegen die flags, die kanonische Beispiel ist
flag_test.gehen
in das flag-Paket Quelle. Der Abschnitt über die Prüfung custom flag-Variablen beginnt bei Zeile 181.flag.Var
🙂Ich bin mir nicht sicher, ob wir uns einig über den Begriff "unit test". Was Sie erreichen wollen, scheint mir
mehr wie ein ziemlich normaler test in einem Programm. Sie wollen wahrscheinlich etwas wie das hier tun:
Leider ist es nicht leicht möglich ist zu verlängern die Flagge Parser mit eigenen Wert-Verifiziereralso, Sie haben zu stick mit dieser für jetzt.
Sehen Intermernet für eine Lösung, die definiert ein benutzerdefiniertes format-Typ und seine Prüfung.