Mam przypadek testowy oparty na tabeli, taki jak ten:
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
}
}
Mógłbym sprawdzić, czy długości są takie same i napisać pętlę, która sprawdza, czy każda para klucz-wartość jest taka sama. Ale potem muszę napisać ten czek ponownie, gdy chcę go użyć do innego typu mapy (powiedzmy map[string]string
).
Skończyło się na tym, że przekonwertowałem mapy na ciągi i porównałem ciągi:
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)
}
Zakłada się, że reprezentacje łańcuchowe równoważnych map są takie same, co wydaje się być prawdą w tym przypadku (jeśli klucze są takie same, to mają tę samą wartość, więc ich kolejność będzie taka sama). Czy jest lepszy sposób, aby to zrobić? Jaki jest idiomatyczny sposób porównywania dwóch map w testach tabelarycznych?