У мене є настільний тестовий приклад, такий як цей:
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
}
}
Я міг перевірити, чи однакові довжини, і написати цикл, який перевіряє, чи однакова кожна пара ключ-значення. Але тоді мені доведеться писати цю перевірку ще раз, коли я хочу використовувати її для іншого типу карти (скажімо map[string]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)
}
Це передбачає, що рядкові подання еквівалентних карт однакові, що в цьому випадку здається вірним (якщо ключі однакові, вони мають хеш до однакового значення, тому їх замовлення будуть однаковими). Чи є кращий спосіб це зробити? Який ідіоматичний спосіб порівняти дві карти в тестах на основі таблиці?