Ich habe einen tischgesteuerten Testfall wie diesen:
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
}
}
Ich könnte überprüfen, ob die Längen gleich sind, und eine Schleife schreiben, die prüft, ob jedes Schlüssel-Wert-Paar gleich ist. Aber dann muss ich diesen Scheck noch einmal schreiben, wenn ich ihn für einen anderen Kartentyp verwenden möchte (sagen wir map[string]string
).
Am Ende habe ich die Maps in Strings konvertiert und die Strings verglichen:
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 Zeichenfolgendarstellungen äquivalenter Karten identisch sind, was in diesem Fall der Fall zu sein scheint (wenn die Schlüssel gleich sind, haben sie den gleichen Wert, sodass ihre Reihenfolge gleich ist). Gibt es einen besseren Weg, dies zu tun? Was ist die idiomatische Methode, um zwei Karten in tabellengesteuerten Tests zu vergleichen?