Mam tabeli napędzane przypadek testowy jak ten:Testowanie równoważność mapy (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
}
}
mogę sprawdzić, czy długości są takie same i napisać pętlę, która sprawdza, czy każda para klucz-wartość Jest taki sam. Ale muszę ponownie napisać ten test, gdy chcę go użyć do innego rodzaju mapy (na przykład map[string]string
).
Co skończyło się robi w tym, że przekształcone mapy do strun i porównywane 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)
}
ta zakłada, że reprezentacje strunowe równoważnych mapy są takie same, co wydaje się być prawdą w tym przypadku (jeśli klawisze są takie same, to mają skrót do tej samej wartości, więc ich zamówienia będą takie same). Czy jest lepszy sposób to zrobić? Jaki jest idiomatyczny sposób porównywania dwóch map w testach sterowanych tabelą?
Err, no: Kolejność Iteracja mapa nie jest gwarancją [przewidywalne] (http://golang.org/ref/spec#For_statements): _ "Kolejność iteracji na mapach nie jest określona i nie ma gwarancji, że będzie taka sama od jednej iteracji do następnej." "_. – zzzz
Ponadto w przypadku map o określonych rozmiarach Go celowo losuje zamówienie. Jest wysoce wskazane, aby nie polegać na tym zamówieniu. –