Rspec: Должно быть (то или это)

Как лучше всего написать rspec в ситуации, когда допустимо любое из двух (или более) исходов?

Вот пример того, что я хочу сделать. Это явно неправильно (я думаю), но это должно дать вам суть того, чего я пытаюсь достичь:

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

И да, я знаю, что могу написать свой собственный rspec matcher "should_be_one_or_the_other(option1,option2)", но это кажется слишком сложным - я надеялся на лучшее решение.

Решение

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

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

Или с помощью нового синтаксиса Rspec 3:

expect(flip_coin).to be_in(["heads", "tails"])
Комментарии (3)

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

it "should be heads or tails" do
  ["heads", "tails"].should include flip_coin
end
Комментарии (2)

Другой способ написания - с ожиданием справа от should:

it 'should be heads or tails' do
  flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
Комментарии (0)