Saya memiliki kasus uji berbasis tabel seperti ini:
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
}
}
Saya dapat memeriksa apakah panjangnya sama dan menulis loop yang memeriksa apakah setiap pasangan nilai kunci sama. Tapi kemudian saya harus menulis centang ini lagi ketika saya ingin menggunakannya untuk jenis peta lain (katakanlah map[string]string
).
Apa yang akhirnya saya lakukan adalah, saya mengonversi peta menjadi string dan membandingkan string:
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)
}
Ini mengasumsikan bahwa representasi string dari peta yang setara adalah sama, yang tampaknya benar dalam kasus ini (jika kuncinya sama maka mereka memiliki nilai yang sama, sehingga urutannya akan sama). Apakah ada cara yang lebih baik untuk melakukan ini? Apa cara idiomatik untuk membandingkan dua peta dalam pengujian berbasis tabel?