Zur Prüfung der Gleichwertigkeit von Karten in Golang?

Ich habe einen table-driven test Fall wie diesem:

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
  }
}

Könnte ich prüfen, ob die Längen identisch sind, und schreiben Sie eine Schleife, die überprüft, ob alle Schlüssel-Wert-paar ist die gleiche. Aber dann habe ich, dies zu schreiben, noch einmal überprüfen, wenn ich es benutzen will, für eine andere Art von Karte (sagen map[string]string).

Was ich am Ende tun, ist, konvertierte ich die Karten auf Streicher und den Vergleich von strings:

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)
}

Dies setzt Voraus, dass die string-Darstellungen von gleichwertigen Karten sind die gleichen, die scheint, um wahr zu sein in diesem Fall (wenn die keys sind die gleichen, dann werden Sie hash den gleichen Wert, so dass Ihre Bestellungen werden die gleichen sein). Gibt es einen besseren Weg, dies zu tun? Was ist die idiomatische Methode zum vergleichen von zwei Karten in table-driven-tests?

  • Äh, Nein: Die Reihenfolge der Iteration einer Karte nicht garantiert werden vorhersehbar: "Die iteration, um über die Karten ist nicht festgelegt und ist nicht garantiert das gleiche von einer zur nächsten iteration. ...".
  • Darüber hinaus wird für Karten von bestimmten Größen Gehen wird absichtlich in zufälliger Reihenfolge. Es ist sehr ratsam, nicht davon abhängen, dass um.
  • Versucht, zu vergleichen eine Karte ist ein design-Fehler in Ihrem Programm.
  • Beachten Sie, dass mit go 1.12 (Feb. 2019), Karten sind jetzt gedruckt in den Schlüssel-sortiert, um Leichtigkeit Tests. Siehe meine Antwort unten
InformationsquelleAutor andras | 2013-08-13
Schreibe einen Kommentar