Rspec: должно быть (то или другое) - PullRequest
30 голосов
/ 28 октября 2011

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

Ответы [ 6 ]

31 голосов
/ 06 июня 2013

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

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

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

expect(flip_coin).to be_in(["heads", "tails"])
21 голосов
/ 04 декабря 2015

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

expect(flip_coin).to eq('heads').or(eq('tails'))
14 голосов
/ 28 октября 2011

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

it "should be heads or tails" do
  ["heads", "tails"].should include flip_coin
end
11 голосов
/ 28 октября 2011

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

it 'should be heads or tails' do
  flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
2 голосов
/ 28 мая 2017

если применяется or с be matcher

expect(flip_coin).to eq('heads').or(be == 'tails')
0 голосов
/ 06 сентября 2018

Вы можете решить эту проблему путем flipping сравнения:

expect(['head','tails']).to include(flip_coin)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...