私はこのようなテーブル駆動のテストケースを持っています:
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)
}
これは、同等のマップの文字列表現が同じであると想定しています。これは、この場合に当てはまるようです(キーが同じである場合、それらは同じ値にハッシュされるため、順序は同じになります)。これを行うためのより良い方法はありますか?テーブル駆動型テストで2つのマップを比較する慣用的な方法は何ですか?