ฉันมีกรณีทดสอบที่ขับเคลื่อนด้วยตารางเช่นนี้:
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)
}
สิ่งนี้ถือว่าการแทนค่าสตริงของแผนที่ที่เทียบเท่านั้นเหมือนกันซึ่งดูเหมือนว่าจะเป็นจริงในกรณีนี้ (หากคีย์เหมือนกันก็จะแฮชเป็นค่าเดียวกันดังนั้นคำสั่งของพวกเขาจะเหมือนกัน) มีวิธีที่ดีกว่านี้หรือไม่? วิธีการเปรียบเทียบสองแผนที่ในการทดสอบที่ขับเคลื่อนด้วยตารางเป็นสำนวนอย่างไร