2013-07-17 18 views
2

我試圖加快我的測試開發使用我用來開發輸出功能的例子。Rspec:爲自定義類測試循環數組,輸入= [],輸出= []。 ruby

我有兩個數組:輸入和輸出。

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

該循環正在工作,但它卡在最後一個索引。例如:如果input.length = 10它總是做功能(輸入[10])==輸出[10]。

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 "analyzes correctly #{input[i]}" do 
     expect(IpmChords::multiple_chords(input[i])).to eq(output[i]) 
    end 
    end 
end 

在控制檯輸出爲:

6) IpmChords multiple_chords analyzes correctly 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"=>""}] 

    (compared using ==) 

    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 <top (required)>' 

7) IpmChords multiple_chords analyzes correctly 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"=>""}] 

    (compared using ==) 

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

你可以看到它一直在評估相同的數組的索引,但測試名稱正在改變每個循環迭代:

6) IpmChords multiple_chords analyzes correctly Bb-7b5 Eb7 
7) IpmChords multiple_chords analyzes correctly E-7 A7 

我認爲這將是一個偉大的節省時間,它應該工作,沒有? 希望你能幫助我。 謝謝

回答

5

您在這裏遇到了Ruby的塊綁定有點問題。發生什麼是每個塊將綁定到i,這仍然在範圍內,這意味着他們被調用,他們都將使用任何i結束(這將是最後一個數組索引)。

如果改爲使用Ruby的塊迭代器,它會工作:

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

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

這部作品的原因是你沒有最終創建出保持在範圍內的每個塊以外的變量,所以每個塊最終以正確的值調用。產生到每個循環的值都在該循環的本地,所以你不會「流血」。

另外,慣用的Ruby通常期望使用枚舉器而不是循環。

風格說明;你可以通過定義然後遍歷期望的輸入和輸出的散列來清理這一點:

describe "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 "analyzes correctly #{chord}" do 
     expect(IpmChords::multiple_chords(chord)).to eq(result) 
    end 
    end 
end 
+0

克里斯的回答是一個很好的,值得肯定的。我已經將這種方法適用於使我的rspec測試數據驅動的一般情況。 – artziff