У меня есть таблица с приводом тестовый пример, как этот:Тестирование эквивалентности карт (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
}
}
Я мог бы проверить длины одинаковы и написать цикл, который проверяет, является ли каждая пара ключ-значение та же. Но тогда я должен снова написать эту проверку, когда захочу использовать ее для другого типа карты (скажем 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)
}
Это предполагает, что строковые представления эквивалентных отображений являются одинаковыми, что, кажется, верно в этом случае (если ключи одинаковы, то они имеют значение hh с тем же значением, поэтому их заказы будут одинаковыми). Есть лучший способ сделать это? Каков идиоматический способ сравнения двух карт в табличных тестах?
Err, нет: Порядок итерация карта не гарантируется [предсказуемый] (http://golang.org/ref/spec#For_statements): _ «Порядок итераций по картам не указан и не может быть одинаковым с одной итерации на следующую. ...» _. – zzzz
Кроме того, для карт определенных размеров Go будет преднамеренно ранжировать заказ. Очень важно не зависеть от этого порядка. –