2013-01-08 10 views
17

Ich versuche, ein Array zu testen, ob ein anderes (rspec 2.11.0)Wie rspec-Array sollte enthalten? ein anderes Array

test_arr = [1, 3] 

describe [1, 3, 7] do 
    it { should include(1,3) } 
    it { should eval("include(#{test_arr.join(',')})")} 
    #failing 
    it { should include(test_arr) } 
end  

enthält, ist dies das Ergebnis rspec spec/test.spec ..F

Failures: 

    1) 1 3 7 
    Failure/Error: it { should include(test_arr) } 
     expected [1, 3, 7] to include [1, 3] 
    # ./spec/test.spec:7:in `block (2 levels) in <top (required)>' 

Finished in 0.00125 seconds 
3 examples, 1 failure 

Failed examples: 

rspec ./spec/test.spec:7 # 1 3 7 

Das Include rspec mehod no akzeptiert ein Array-Argument, es gibt eine bessere Möglichkeit, "eval" zu vermeiden.

Antwort

31

nur verwenden, um den splat (*) Operator, der eine Anordnung von Elementen in eine Liste von Argumenten erweitert, die auf ein Verfahren übergeben werden können:

test_arr = [1, 3] 

describe [1, 3, 7] do 
    it { should include(*test_arr) } 
end 
+0

sehr interessanter Link – GioM

+2

OMG! Das ist überwältigend ... ernst, das ist wirklich sehr nützlich in den Spezifikationen, ich wusste nicht #include unterstützte Liste von Argumenten. Vielen Dank! –

4

Wenn Sie die Order des Subset-Arrays bestätigen möchten, müssen Sie ein tun Bit mehr als should include(..), weil RSpec include Matcher nur behauptet, dass jedes Element irgendwo im Array auftaucht, nicht, dass alle Argumente in der Reihenfolge angezeigt werden.

endete ich, dass die vorhanden, um Sub-Array ist mit each_cons zu überprüfen oben, wie folgt aus:

describe [1, 3, 5, 7] do 
    it 'includes [3,5] in order' do 
    subject.each_cons(2).should include([3,5]) 
    end 

    it 'does not include [3,1]' do 
    subject.each_cons(2).should_not include([3,1]) 
    end 
end 
Verwandte Themen