[解決済み] Golangでマップの等価性をテストするには?
2022-10-30 08:54:49
質問
このようなテーブル駆動のテストケースがあります。
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つのマップを比較する慣用的な方法は何ですか?
どのように解決するのですか?
Goのライブラリがすでにカバーしています。これを実行します。
import "reflect"
// m1 and m2 are the maps we want to compare
eq := reflect.DeepEqual(m1, m2)
if eq {
fmt.Println("They're equal.")
} else {
fmt.Println("They're unequal.")
}
を見ると
ソースコード
に対して
reflect.DeepEqual
's
Map
の場合、まず両方のマップが nil かどうかをチェックし、次に同じ長さかどうかをチェックし、最後に (key, value) ペアのセットが同じかどうかをチェックしていることがわかると思います。
なぜなら
reflect.DeepEqual
はインターフェース型を取るので、どんな有効なマップでも動作します (
map[string]bool, map[struct{}]interface{}
など) に対して動作します。マップ以外の値でも動作するので、渡しているものが本当に2つのマップであるかどうか注意してください。もし2つの整数を渡せば、それが等しいかどうかを喜んで教えてくれるでしょう。
関連
-
[解決済み] モックとスタブの違いは何ですか?
-
[解決済み] Goでマップにキーが含まれているかどうかを確認するには?
-
[解決済み] goで文字列の連結を効率的に行う方法
-
[解決済み] Gradleを使用して1つのユニットテストクラスのみを実行する方法
-
[解決済み] Pythonのクラスで等価性(equality)をサポートするエレガントな方法
-
[解決済み] 抽象クラスをユニットテストする方法:スタブで拡張する?
-
[解決済み】"testing "パッケージを使用したGoテストで印刷するにはどうすればいいですか?
-
[解決済み] angular2のテスト。ngModel' は 'input' の既知のプロパティではないので、バインドできない
-
[解決済み] Jestの「toBe」と「toEqual」の違いは何ですか?
-
[解決済み] SpockテストフレームワークにおけるMock/Stub/Spyの相違点
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン