2011-10-27 11 views
23

Jaki byłby najlepszy sposób napisania rspec w sytuacji, gdy jeden z dwóch (lub więcej) wyników jest akceptowalny?Rspec: Powinien być (ten lub inny).

Oto przykład tego, co chcę zrobić. To jest oczywiście błędna (chyba), ale powinno dać ci istotę tego, co próbuję wykonać:

it "should be heads or tails" do 
    h="heads" 
    t="tails" 
    flip_coin.should be(h || t) 
end 

I tak, jestem świadomy Mógłbym napisać własny rspec dopasowujący „should_be_one_or_the_other (opcja1 , opcja2) ", ale wydaje się, że jest trochę za dużo - miałem nadzieję na lepsze rozwiązanie.

Odpowiedz

24

ActiveSupport zapewnia Object#in? metody. Można łączyć je z RSpec i po prostu kliknąć na poniższy:

flip_coin.should be_in(["heads", "tails"]) 

Albo z nową rspec 3 składnię:

expect(flip_coin).to be_in(["heads", "tails"]) 
+0

To nie działało dla mnie w najnowszej wersji, musiałem zmienić ją w tablicę najpierw 'be_in ([" heads "," ogony "])' – Vox

+0

Dzięki za sprzężenie zwrotne –

+1

Drobna korekta: ActiveSupport definiuje '#in?' na 'Object', a nie na' Array', ponieważ nazywa się tak 'flip_coin.in? % w (heads tails) 'i flip_coin mogą być dowolnymi' Object'. –

14

I pewnie napisać coś takiego:

it "should be heads or tails" do 
    ["heads", "tails"].should include flip_coin 
end 
+5

dobrą opcją, ale wydaje się, że podważa odpowiednie „rspec” sposób robienia rzeczy, z oczekiwaną wartość na dobrze. – GlyphGryph

+1

Tak źle, ale zdecydowanie najczystsza składnia. – idrinkpabst

11

Innym sposobem pisania z oczekiwaniem na prawej stronie powinien:

it 'should be heads or tails' do 
    flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)} 
end 
15

Wiem, że to stary ale wpadłem na to na RSpec 3.4, istnieje teraz or keyword. Więc to jest ważne:

expect(flip_coin).to eq('heads').or(eq('tails')) 
1

jeśli zastosowano or z be dopasowującego

expect(flip_coin).to eq('heads').or(be == 'tails') 
+0

Uważam, że jest to mniej intuicyjne niż w przypadku odpowiedzi "lub" z grudnia 15. –

Powiązane problemy