J'ai un scénario de test piloté par tableau comme celui-ci :
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
}
}
Je pourrais vérifier si les longueurs sont les mêmes et écrire une boucle qui vérifie si chaque paire clé-valeur est la même. Mais je dois alors réécrire cette vérification lorsque je veux l'utiliser pour un autre type de carte (disons map[string]string
).
Ce que j'ai fini par faire, c'est convertir les cartes en chaînes de caractères et comparer les chaînes :
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)
}
Cela suppose que les représentations des chaînes de caractères des cartes équivalentes sont les mêmes, ce qui semble être vrai dans ce cas (si les clés sont les mêmes, alors elles sont hachées vers la même valeur, donc leurs ordres seront les mêmes). Existe-t-il une meilleure façon de procéder ? Quelle est la façon idiomatique de comparer deux cartes dans des tests pilotés par des tableaux ?