2011-10-27 29 views
23

Cách tốt nhất để viết rspec trong trường hợp một trong hai (hoặc nhiều) kết quả có thể chấp nhận được không?Rspec: Nên là (điều này hoặc điều đó)

Đây là ví dụ về những gì tôi muốn làm. Đây rõ ràng là sai (tôi nghĩ), nhưng nó sẽ cho bạn những ý chính về những gì tôi đang cố gắng để hoàn thành:

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

Và vâng, tôi biết tôi có thể viết riêng tôi rspec khớp "should_be_one_or_the_other (option1 , option2) ", nhưng điều đó có vẻ hơi nhiều - tôi đã hy vọng cho một giải pháp tốt hơn.

Trả lời

24

ActiveSupport cung cấp Object#in? phương pháp. Bạn có thể kết hợp nó với RSpec và chỉ cần sử dụng như sau:

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

Hoặc với mới RSpec 3 cú pháp:

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

Điều này không có tác dụng đối với tôi trong phiên bản mới nhất, tôi phải biến nó thành mảng đầu tiên 'be_in ([" heads "," tails "])' – Vox

+0

Cảm ơn phản hồi –

+1

Chỉnh sửa nhỏ: ActiveSupport định nghĩa '#in?' trên 'Đối tượng', không phải trên' Mảng', vì nó được gọi là «flip_coin.in» này? % w (đầu đuôi) 'và flip_coin có thể là bất kỳ' đối tượng' nào. –

14

tôi có lẽ muốn viết một cái gì đó như thế này:

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

Một lựa chọn khá, nhưng nó có vẻ như nó subverts "rspec" đúng cách để làm điều này, với giá trị kỳ vọng trên đúng. – GlyphGryph

+1

Có sai cách xung quanh, nhưng chắc chắn cú pháp sạch nhất – idrinkpabst

11

Một cách khác để viết nó với sự kỳ vọng về bên phải nên:

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

Tôi biết điều này là cũ nhưng tôi chạy vào này trên RSpec 3.4, có hiện tại là or keyword. Vì vậy, đây là hợp lệ:

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

nếu áp dụng or với be khớp

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

Tôi thấy điều này kém trực quan hơn câu trả lời bằng cách sử dụng "hoặc" từ tháng 12 '15. –

Các vấn đề liên quan