Ho un test case basato su tabelle come questo:
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
}
}
Potrei controllare se le lunghezze sono le stesse e scrivere un ciclo che controlla se ogni coppia chiave-valore è la stessa. Ma poi devo scrivere di nuovo questo controllo quando voglio usarlo per un altro tipo di mappa (diciamomap[string]string
).
Quello che ho finito per fare è che ho convertito le mappe in stringhe e ho confrontato le stringhe:
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)
}
Ciò presuppone che le rappresentazioni di stringa delle mappe equivalenti siano le stesse, il che sembra essere vero in questo caso (se le chiavi sono le stesse, hanno lo stesso valore, quindi i loro ordini saranno gli stessi). C'è un modo migliore per farlo? Qual è il modo idiomatico per confrontare due mappe nei test basati su tabelle?