2013-01-08 13 views
17

Próbuję sprawdzić, czy tablica zawiera inny (rspec 2.11.0)Jak powinna wyglądać tablica rspec? kolejna tablica

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  

Jest to wynik 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 

Zawiera rspec mehod, nie akceptuje argumentu tablicowego, czy jest lepszy sposób na uniknięcie "eval"?

Odpowiedz

31

prostu używać (*) operatora splat, który rozszerza się szereg elementów na liście argumentów, które może być przekazywane do metody:

test_arr = [1, 3] 

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

bardzo interesujący odnośnik – GioM

+2

OMG! To oszałamiające ... poważne, jest to naprawdę przydatne w specyfikacjach, nie znałem # include obsługiwanej listy argumentów. Dziękuję Ci! –

4

Jeśli chcesz potwierdzić zamówienie z zestawu podzbiorów, musisz wykonać nieco więcej niż should include(..), ponieważ macierz RSpec include tylko potwierdza, że ​​każdy element pojawia się w dowolnym miejscu w tablicy, a nie wszystkie argumenty pojawiają się w kolejności.

skończyło się używając each_cons aby upewnić się, że sub-array obecny jest w porządku, tak:

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