Подтвердить что ты не робот

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)", но это кажется немного большим - я надеялся на лучшее решение.

4b9b3361

Ответ 1

ActiveSupport предоставляет метод Object#in?. Вы можете комбинировать его с RSpec и просто использовать следующее:

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

Или с новым синтаксисом Rspec 3:

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

Ответ 2

Я знаю, что это старо, но я столкнулся с этим на RSpec 3.4, теперь есть or keyword. Так что это действительно:

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

Ответ 3

Я бы, наверное, написал что-то вроде этого:

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

Ответ 4

Другой способ записать его с ожиданием справа от него:

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

Ответ 5

если применяется or с be совпадением

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