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