Ich habe einen tabellengesteuerte Testfall wie diesen:Testing Gleichwertigkeit von Karten (Golang)
func CountWords(s string) map[string]int
func TestCountWords(t *testing.T) {
var tests = []struct {
input string
want map[string]int
}{
{"foo", map[string]int{"foo":1}},
{"foo bar foo", map[string]int{"foo":2,"bar":1}},
}
for i, c := range tests {
got := CountWords(c.input)
// TODO test whether c.want == got
}
}
konnte ich überprüfen, ob die Längen gleich sind und eine Schleife schreiben, wenn jeder Schlüssel-Wert-Paar überprüft ist dasselbe. Aber dann muss ich diese Prüfung erneut schreiben, wenn ich sie für eine andere Art von Karte verwenden möchte (zB map[string]string
).
Was ich tat endete, umgerechnet ich die Karten in Strings und verglichen die Saiten:
func checkAsStrings(a,b interface{}) bool {
return fmt.Sprintf("%v", a) != fmt.Sprintf("%v", b)
}
//...
if checkAsStrings(got, c.want) {
t.Errorf("Case #%v: Wanted: %v, got: %v", i, c.want, got)
}
Dies setzt voraus, dass die Stringdarstellungen äquivalenter Karten gleich sind, die in diesem Fall um wahr zu sein scheinen (Wenn die Schlüssel identisch sind, werden sie auf den gleichen Wert gerastert, so dass ihre Aufträge gleich sind). Gibt es einen besseren Weg, dies zu tun? Was ist der idiomatische Weg, zwei Maps in tabellengesteuerten Tests zu vergleichen? Diese
Err, nein: Die Reihenfolge Iterieren eine Karte nicht sein [berechenbar] gewährleistet ist (http://golang.org/ref/spec#For_statements): _ "Die Iterationsreihenfolge über Maps ist nicht spezifiziert und es ist nicht garantiert, dass sie von einer Iteration zur nächsten identisch sind. ..." _. – zzzz
Darüber hinaus wird Go für Karten bestimmter Größen die Reihenfolge absichtlich zufällig verteilen. Es ist sehr ratsam, sich nicht auf diese Reihenfolge zu verlassen. –