2 Stimmen

Rspec: Testen von Schleifenarrays, Eingabe = [], Ausgabe = [] für benutzerdefinierte Klassen. Ruby

Ich versuche, die Entwicklung meiner Tests zu beschleunigen, indem ich die Beispiele verwende, die ich zur Entwicklung der Funktion im Output verwende.

Ich habe zwei Arrays: Eingabe und Ausgabe.

function(input[0]) == output[0].

Die Schleife funktioniert, bleibt aber im letzten Index stecken. Beispiel: Wenn input.length = 10 ist, führt sie immer function(input[10]) == output[10] aus.

describe "multiple_chords" do
  input = ["A7 DMaj79", "E-7 A7", "D-7 G7", "Bb-7b5 Eb7b9" , "Bb-7b5 Eb7", "G7 A7", "D-7b5 G7b9", "D-79 G#7913"]
  output = [[{"root"=>"A", "def"=>"7"}, {"root"=>"D", "def"=>"Maj7"}], [{"root"=>"E", "def"=>"-7"}, {"root"=>"A", "def"=>"7"}], [{"root"=>"D", "def"=>"-7"}, {"root"=>"G", "def"=>"7"}], [{"root"=>"Bb", "def"=>"-7b5"}, {"root"=>"Eb", "tensions"=>"b9", "def"=>"7"}], [{"root"=>"Bb", "def"=>"-7b5"}, {"root"=>"Eb", "def"=>"7"}], [{"root"=>"G", "def"=>"7"}, {"root"=>"A", "def"=>"7"}], [{"root"=>"D", "def"=>"-7b5"}, {"root"=>"G", "tensions"=>"b9", "def"=>"7"}], [{"root"=>"D", "tensions"=>"9", "def"=>"-7"}, {"root"=>"G#", "tensions"=>["9", "13"], "def"=>"7"}]]

  for i in 0..input.length-1
    it "analysiert korrekt #{input[i]}" do
      expect(IpmChords::multiple_chords(input[i])).to eq(output[i])
    end
  end
end

Der Output in der Konsole ist:

 6) IpmChords multiple_chords analysiert korrekt Bb-7b5 Eb7
 Failure/Error: expect(IpmChords::multiple_chords(input[i])).to eq(output[i])

   expected: [{"root"=>"D", "tensions"=>"9", "def"=>"-7"}, {"root"=>"G#", "tensions"=>["9", "13"], "def"=>"7"}]
        got: [{"root"=>"D", "tensions"=>"9", "def"=>"-7"}, {"root"=>"G#", "tensions"=>"13", "def"=>""}]

   (verglichen mit ==)

   Diff:
   @@ -1,3 +1,3 @@
    [{"root"=>"D", "tensions"=>"9", "def"=>"-7"},
   - {"root"=>"G#", "tensions"=>["9", "13"], "def"=>"7"}]
   + {"root"=>"G#", "tensions"=>"13", "def"=>""}]

 # ./spec/ipm_classes/ipm_chords_ipm_class_spec.rb:28:in `block (4 levels) in '

7) IpmChords multiple_chords analysiert korrekt E-7 A7
 Failure/Error: expect(IpmChords::multiple_chords(input[i])).to eq(output[i])

   expected: [{"root"=>"D", "tensions"=>"9", "def"=>"-7"}, {"root"=>"G#", "tensions"=>["9", "13"], "def"=>"7"}]
        got: [{"root"=>"D", "tensions"=>"9", "def"=>"-7"}, {"root"=>"G#", "tensions"=>"13", "def"=>""}]

   (verglichen mit ==)

   Diff:
   @@ -1,3 +1,3 @@
    [{"root"=>"D", "tensions"=>"9", "def"=>"-7"},
   - {"root"=>"G#", "tensions"=>["9", "13"], "def"=>"7"}]
   + {"root"=>"G#", "tensions"=>"13", "def"=>""}]

Man kann sehen, dass immer derselbe Array-Index ausgewertet wird, aber der Testname ändert sich für jede Schleifeniteration:

6) IpmChords multiple_chords analysiert korrekt Bb-7b5 Eb7
7) IpmChords multiple_chords analysiert korrekt E-7 A7

Ich denke, es wird eine große Zeitersparnis sein und es sollte funktionieren, oder?? Hoffe, Sie können mir helfen. Danke

7voto

Chris Heald Punkte 59198

Sie stoßen hier auf ein kleines Problem mit den Blockbindungen von Ruby. Was passiert ist, dass jeder Block an i bindet, welches im Gültigkeitsbereich bleibt, was bedeutet, dass sie, wenn sie aufgerufen werden, alle verwenden, was auch immer i am Ende ist (was der letzte Array-Index sein wird).

Wenn Sie stattdessen Ruby's Block-Iteratoren verwenden, wird es funktionieren:

beschreibe "multiple_chords" do
  input = ["A7 DMaj79", "E-7 A7", "D-7 G7", "Bb-7b5 Eb7b9" , "Bb-7b5 Eb7", "G7 A7", "D-7b5 G7b9", "D-79 G#7913"]
  output = [[{"root"=>"A", "def"=>"7"}, {"root"=>"D", "def"=>"Maj7"}], [{"root"=>"E", "def"=>"-7"}, {"root"=>"A", "def"=>"7"}], [{"root"=>"D", "def"=>"-7"}, {"root"=>"G", "def"=>"7"}], [{"root"=>"Bb", "def"=>"-7b5"}, {"root"=>"Eb", "tensions"=>"b9", "def"=>"7"}], [{"root"=>"Bb", "def"=>"-7b5"}, {"root"=>"Eb", "def"=>"7"}], [{"root"=>"G", "def"=>"7"}, {"root"=>"A", "def"=>"7"}], [{"root"=>"D", "def"=>"-7b5"}, {"root"=>"G", "tensions"=>"b9", "def"=>"7"}], [{"root"=>"D", "tensions"=>"9", "def"=>"-7"}, {"root"=>"G#", "tensions"=>["9", "13"], "def"=>"7"}]]

  input.each_with_index do |chord, index|
    it "analysiert korrekt #{chord}" do
      expect(IpmChords::multiple_chords(chord)).to eq(output[index])
    end
  end
end

Der Grund, warum dies funktioniert, ist, dass Sie keine Variable außerhalb jedes Blocks erstellen, die im Gültigkeitsbereich bleibt, sodass jeder Block mit den korrekten Werten aufgerufen wird. Die an jede Schleife übergebenen Werte sind lokal für diese Schleife, sodass kein "Übersprechen" auftritt.

Übrigens, im idiomatischen Ruby wird im Allgemeinen die Verwendung von Enumeratoren erwartet, anstelle von for-Schleifen.

Eine Anmerkung zum Stil; Sie können dies etwas aufräumen, indem Sie einfach einen Hash von erwarteten Eingaben und Ausgaben definieren und dann darüber iterieren:

beschreibe "multiple_chords" do
  CHORD_MAP = {
    "A7 DMaj79" => [{"root"=>"A", "def"=>"7"}, {"root"=>"D", "def"=>"Maj7"}],
    "E-7 A7"    => [{"root"=>"E", "def"=>"-7"}, {"root"=>"A", "def"=>"7"}],
    # ...
  }

  CHORD_MAP.each do |chord, result|
    it "analysiert korrekt #{chord}" do
      expect(IpmChords::multiple_chords(chord)).to eq(result)
    end
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X