Rspec: повинен бути (тим чи іншим)

Який найкращий спосіб написати rspec у ситуації, коли один з двох (або більше) результатів є прийнятним?

Ось приклад того, що я хочу зробити. Це, очевидно, не так (я думаю), але воно має дати вам сутність того, що я намагаюсь виконати:

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

І так, я знаю, що я можу написати свій власний параметр rspec "should_be_one_or_the_other (option1, option2)", але це здається трохи - я сподівався на краще рішення.

26

5 Відповіді

ActiveSupport забезпечує метод Object # in? . Ви можете об'єднати його з RSpec і просто використовувати наступне:

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

Або з новим синтаксисом Rspec 3:

expect(flip_coin).to be_in(["heads", "tails"])
28
додано
Незначна корекція: ActiveSupport визначає #in? Object , а не Array , оскільки він називається таким: flip_coin.in? % w (головні хвости) і flip_coin може бути будь-яким Object .
додано Автор Dave Schweisguth, джерело
Дякую за відгук
додано Автор Sergey Potapov, джерело
Це не спрацювало для мене в останній версії, мені довелося перетворити його в масив першим be_in (["голови", "хвости"])
додано Автор Vox, джерело

Я знаю, що це старе, але я потрапив до цього на RSpec 3.4, є або ключове слово зараз. Тож це дійсно:

expect(flip_coin).to eq('heads').or(eq('tails'))
19
додано

Я б, напевно, написав щось на зразок цього:

it "should be heads or tails" do
  ["heads", "tails"].should include flip_coin
end
14
додано
Так, невірно, але явно найчистіший синтаксис
додано Автор idrinkpabst, джерело
Пристойний варіант, але, схоже, він підриває правильний "rspec" спосіб робити речі, з очікуваною цінністю справа.
додано Автор GlyphGryph, джерело

Інший спосіб написання його з очікуванням на правій стороні повинен:

it 'should be heads or tails' do
  flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
11
додано

якщо застосовано або з matcher be

expect(flip_coin).to eq('heads').or(be == 'tails')
2
додано
Я вважаю це менш інтуїтивним, ніж відповідь, використовуючи "або" з грудня '15.
додано Автор Dave Newton, джерело