Ich überlege gerade, wie ich Tests schreiben soll, die prüfen, ob ein bestimmter Code in Panik gerät. Ich weiß, dass Go recover
Panik auslöst, aber im Gegensatz zu Java-Code können Sie nicht genau angeben, welcher Code im Falle einer Panik übersprungen werden soll oder was Sie haben. Also, wenn ich eine Funktion habe:
func f(t *testing.T) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
OtherFunctionThatPanics()
t.Errorf("The code did not panic")
}
Ich kann nicht wirklich sagen, ob OtherFunctionThatPanics
wir in Panik geraten sind und uns erholt haben oder ob die Funktion überhaupt nicht in Panik geraten ist. Wie gebe ich an, welcher Code übersprungen werden soll, wenn keine Panik vorliegt, und welcher Code ausgeführt werden soll, wenn eine Panik auftritt? Wie kann ich überprüfen, ob es eine Panik gab, von der wir uns erholt haben?
r := recover(); r == nil
und nicht nurrecover() == nil
?Wenn Sie testify / assert verwenden , handelt es sich um einen Einzeiler:
Oder wenn Sie
OtherFunctionThatPanics
eine andere Unterschrift haben alsfunc()
:Wenn Sie noch nicht versucht haben, Zeugnis zu geben, lesen Sie auch Zeugnis / Verspottung . Super einfache Behauptungen und Verspottungen.
quelle
Beim Durchlaufen mehrerer Testfälle würde ich Folgendes wählen:
Geh auf den Spielplatz
quelle
Wenn Sie den Inhalt der Panik überprüfen müssen, können Sie den wiederhergestellten Wert typisieren:
Wenn der Code, den Sie testen, nicht in Panik gerät ODER mit einem Fehler in Panik gerät ODER mit der von Ihnen erwarteten Fehlermeldung in Panik gerät, schlägt der Test fehl (was Sie möchten).
quelle
In Ihrem Fall können Sie Folgendes tun:
Als generische Panik-Router-Funktion funktioniert dies auch:
https://github.com/7d4b9/recover
quelle
Prägnanter Weg
Für mich ist die folgende Lösung leicht zu lesen und zeigt Ihnen den natürlichen Codefluss des zu testenden Codes.
Für eine allgemeinere Lösung können Sie dies auch folgendermaßen tun:
quelle
Sie können testen, welche Funktion in Panik geraten ist, indem Sie Panik eingeben
http://play.golang.org/p/ORWBqmPSVA
quelle