#ruby #rspec
#ruby #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"])
Комментарии:
1. Это не сработало для меня в последней версии, мне пришлось сначала превратить его в массив
be_in(["heads", "tails"])
2. Спасибо за отзыв
3. Небольшая поправка: ActiveSupport определяет
#in?
onObject
, а не onArray
, поскольку он вызывается такflip_coin.in? %w(heads tails)
, а flip_coin может быть любымObject
.
Ответ №2:
Я знаю, что это старое, но в RSpec 3.4 я столкнулся с этим, теперь есть or
ключевое слово. Так что это действительно:
expect(flip_coin).to eq('heads').or(eq('tails'))
Ответ №3:
Я бы, наверное, написал что-то вроде этого:
it "should be heads or tails" do
["heads", "tails"].should include flip_coin
end
Комментарии:
1. Достойный вариант, но, похоже, он подрывает правильный способ выполнения «rspec», с ожидаемым значением справа.
Ответ №4:
Другой способ записать его с ожиданием справа от should:
it 'should be heads or tails' do
flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
Ответ №5:
если применяется or
с be
помощью matcher
expect(flip_coin).to eq('heads').or(be == 'tails')
Комментарии:
1. Я нахожу это менее интуитивным, чем ответ с использованием «или» от 15 декабря.
Ответ №6:
Вы можете решить это путем flipping
сравнения:
expect(['head','tails']).to include(flip_coin)