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

#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? on Object , а не on Array , поскольку он вызывается так 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)