Wie testen Sie eine Funktion Ausgabe (stdout/stderr) in Go unit-tests
Habe ich eine einfache Funktion, die ich testen möchte:
func (t *Thing) print(min_verbosity int, message string) {
if t.verbosity >= minv {
fmt.Print(message)
}
}
Aber wie kann ich testen, was die Funktion eigentlich sendet auf der standard-Ausgabe? Test::Output tut, was ich will in Perl. Ich weiß, ich könnte schreiben, die alle meine eigene boilerplate, das gleiche zu tun in der Go (wie beschrieben hier):
orig = os.Stdout
r,w,_ = os.Pipe()
thing.print("Some message")
var buf bytes.Buffer
io.Copy(&buf, r)
w.Close()
os.Stdout = orig
if(buf.String() != "Some message") {
t.Error("Failure!")
}
Aber das ist viel zusätzliche Arbeit für jeden einzelnen test. Ich hoffe, es gibt ein standard-Art, oder vielleicht eine Abstraktion, die Bibliothek zu handhaben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Sache auch Bedenken, es gibt nichts hindert Sie schreiben von Funktionen zu vermeiden, die boilerplate.
Zum Beispiel habe ich ein Kommandozeilen-app, die verwendet
log
und ich schrieb diese Funktion:Dann verwendet es wie folgt:
Verwendung dieser assert-Bibliothek: http://godoc.org/github.com/stretchr/testify/assert.
Können Sie eines von zwei Dingen tun. Die erste ist die Verwendung Beispiele.
Den zweiten (und passender, IMO) ist die Verwendung von fake-Funktionen für Ihre IO. In Ihrem code können Sie tun:
Und in den tests:
Andere Möglichkeit ist die Verwendung
fmt.Fprintf
mit einemio.Writer
istos.Stdout
in der Produktion code, kann aber sagenbytes.Buffer
in tests.Könnten Sie überlegen, das hinzufügen einer return-Anweisung, um Ihre Funktion auf den string, der tatsächlich ausgedruckt.
Nun, Ihren test konnte nur überprüfen Sie die zurückgegebene Zeichenfolge gegen eine zu erwartende string (eher als die print-out). Vielleicht ein bisschen mehr in-line mit Test-Driven Development (TDD).
Und, in Ihrer Produktions-code, nichts würde ändern müssen, da Sie nicht haben, weisen Sie den Rückgabewert einer Funktion, wenn Sie es nicht brauchen.