私はこのようなテーブル駆動テストケースを有する:テスト等価(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)
}
これは、この場合には真であると思われる、同等のマップの文字列表現が同じであることを前提としてい(キーが同じであれば、同じ値にハッシュされるので、その順序は同じになります)。これを行うより良い方法はありますか?テーブル駆動型テストで2つのマップを比較する慣習的な方法は何ですか?
のErr、NO:マップを反復順序は[予測可能]であることが保証されていない(http://golang.org/ref/spec#For_statements ):_ "マップ上の反復順序は指定されておらず、ある反復から次の反復まで同じであることが保証されていません。 – zzzz
さらに、特定のサイズのマップについては、Goを意図的にランダム化します。その順序に依存しないことを強くお勧めします。 –