Eu tenho um caso de teste baseado em tabela como este:
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
}
}
Eu poderia verificar se os comprimentos são iguais e escrever um loop que verifica se todos os pares de valores-chave são iguais. Mas então eu tenho que escrever essa verificação novamente quando quiser usá-la para outro tipo de mapa (digamos map[string]string
).
O que acabei fazendo é converter os mapas em strings e comparar as strings:
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)
}
Isso pressupõe que as representações de string de mapas equivalentes são as mesmas, o que parece ser verdade neste caso (se as chaves forem as mesmas, então eles hash para o mesmo valor, portanto, suas ordens serão as mesmas). Existe uma maneira melhor de fazer isso? Qual é a maneira idiomática de comparar dois mapas em testes baseados em tabelas?